Ora che la domanda di how to parse a string for magnitude and physical unit è stata risolta, la prossima domanda è: come si dovrebbe procedere meglio per riunire questi due insieme in un modo che, da un lato, non costa troppe prestazioni, ma dall'altro aggiunge una convalida dell'unità .Come decodificare tonicamente grandezza e unità fisiche?
Per chiarire cosa intendo, prendere come esempio due velocità v = 5 m/s
e u = 10 mph
. Lo previous question si occupa già della conversione di tutto in SI units (quindi non lo sarà crash another Mars mission a causa di che). Quindi internamente avremmo ad es. una tupla v = (5, m/s)
e u = (4.4704, m/s)
e la routine di output si occuperà di utilizzare le unità preferite per l'output. Durante l'applicazione di operazioni compatibili con le unità sui due, ad es. l'aggiunta o la sottrazione dei loro quadrati sono validi, altri come v - 1/u
sono completi e senza senso. Ma come dovrebbe essere implementato al meglio? Alcune possibilità che ho considerato finora:
- no. Poiché internamente vengono utilizzate solo unità SI, è essere ovvio quali unità si applicano. Ma trascurare queste informazioni è molto probabile che diventi una fonte di bug se le formule diventano più complesse
- Sottoclasse
tuple
e sostituiscono tutte le operazioni valide che precedono i controlli di coerenza delle unità. Sembra divertente ... - Memorizza i valori come
sympy.core.mul.Mul
s dei tempi di magnitudine a (funzione significativa di)sympy.physics.unit.Unit
, ad esempiov = 5*unit.m/unit.s
. Non mi aspetto grandi prestazioni di questo, in più dovrei comunque verificare se il risultato di un'operazione è ancora del modulomagnitude * unit
. - Utilizzare un
numpy.array
con una voce aggiuntivasympy.physics.unit.Unit
, che già implementa le operazioni elementwise. Questo sarebbe ancora bisogno di un controllo di un'unità di coerenza manuale dopo (il fatto che ad esempiom+m=2m
sarebbe anche bisogno di essere trattati ...) - sottoclasse
numpy.array
invece dituple
, ignorare gli operatori anteponendo il controllo di coerenza unità prima chiamare ilsuper
- operatori sull'array senza l'unità. Forse qualche__getattribute__
magia potrebbe semplificare questo in quanto tutte le operazioni valide sono già implementati sia per la grandezza e l'unità ...
è una di queste soluzioni di buona/divinatorio? O quale altro modo c'è? Esiste già una libreria che tratta questo?
modifica Si noti che questo non deve essere limitato ai valori scalari; vettori, matrici (forse anche sympy.Symbol
i) dovrebbero funzionare anche
Sembra buono (il messaggio di errore riguarda i poteri dell'unità SI, suppongo). Può anche trattare gli array? –
Intendi liste?'[mg (t, 's') * mg (70, 'km/h') per t in range (10)]' –
Stavo pensando a vettori e matrici, ad es. I vettori di velocità 3D, e qualcosa come 'mg ([. 5,0,3], 'm/s')' probabilmente sembrano più belli di '[mg (.5, 'm/s'), mg (0, ' m/s '), mg (3,' m/s ')] ' –