单位
一个解决方案是从 SymPyunits
模块中收集所有单元,并使用它们来替换由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 支持做出任何承诺。
如果你实现 new Unit
s,请考虑在 github 上向他们提出 pull request。要编辑的文件应该是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 的应用程序,则可利用的用途!