単位
units
解決策は、SymPyモジュールからすべてのユニットを収集し、それらを使用して、によって作成されたシンボルを置き換えることです。sympify
>>> import sympy.physics.units as u
... subs = {}
... for k, v in u.__dict__.items():
... if isinstance(v, Expr) and v.has(u.Unit):
... subs[Symbol(k)] = v # Map the `Symbol` for a unit to the unit
>>> # sympify returns `Symbol`s, `subs` maps them to `Unit`s
>>> print sympify('yard*millimeter/ly').subs(subs)
127*m/1313990343414000000000
シンボルが含まれていない場合は、units
不明なシンボルとして出力されます (例: barn
)
>>> print sympify('barn/meter**2').subs(subs)
barn/m**2
subs
ただし、いつでも辞書に追加できます。
>>> subs[Symbol('almost_meter')] = 0.9*u.meter
... sympify('almost_meter').subs(subs)
0.9*m
SI 接頭辞は、希望どおりには機能しません。乗算記号を追加する必要があります (またはkm
明示的に実装されているような一般的な単位であることを願っています)。さらに、それらはインスタンスではUnit
なくインスタンスであるため、それらを次Integer
の場所に追加する必要があります。subs
>>> import sympy.physics.units as u
... subs = {}
... for k, v in u.__dict__.items():
... if (isinstance(v, Expr) and v.has(u.Unit)) or isinstance(v, Integer):
... subs[Symbol(k)] = v
>>> print sympify('mega*m').subs(subs)
1000000*m
Unicode の場合、前処理が必要になる場合があります。SymPy が Unicode のサポートについて約束しているとは思いません。
新しい を実装する場合はUnit
、github でプル リクエストを作成することを検討してください。編集するファイルはsympy/physics/units.py
.
空白と暗黙の乗算
SymPy の開発バージョンでは、適切な空白が記述されている暗黙的な乗算を想定するためのコードを見つけることができます。
>>> from sympy.parsing.sympy_parser import (parse_expr,
... standard_transformations, implicit_multiplication_application)
>>> parse_expr("10sin**2 x**2 + 3xyz + tan theta",
... transformations=(standard_transformations +
... (implicit_multiplication_application,)))
3*x*y*z + 10*sin(x**2)**2 + tan(theta)
安全
sympify
eval
これは、Web 向けアプリに使用する場合に悪用される可能性があります。