检测变量是否为sympy类型

时间:2015-05-04 05:19:28

标签: python sympy isinstance

我有一个变量,可能是也可能不是一个同情类。我想将它转换为浮点数,但我在以一般方式执行此操作时遇到了麻烦:

$ python
Python 2.7.3 (default, Dec 18 2014, 19:10:20) 
[GCC 4.6.3] on linux2
>>> import sympy
>>> x = sympy.sqrt(2)
>>> type(x)
<class 'sympy.core.power.Pow'>
>>> y = 1 + x
>>> type(y)
<class 'sympy.core.add.Add'>
>>> z = 3 * x
>>> type(z)
<class 'sympy.core.mul.Mul'>
>>> if isinstance(z, sympy.core):
...     z = z.evalf(50) # 50 dp
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

我将测试xyz以转换为浮点数。请注意,我无法在evalf()xy上运行z而无需检查,因为它们可能已经是整数或浮点数,这会引发异常。

遗憾的是,

sympy.sympify()未转换为浮点数。如果它确实那么这将是我的问题的理想解决方案:

>>> sympy.sympify(z)
3*sqrt(2)
>>> type(sympy.sympify(z))
<class 'sympy.core.mul.Mul'>

3 个答案:

答案 0 :(得分:6)

所有同情对象都继承自sympy.Basic。要以数字方式评估症状表达,只需使用.n()

In [1]: import sympy

In [2]: x = sympy.sqrt(2)

In [3]: x
Out[3]: sqrt(2)

In [4]: x.n()
Out[4]: 1.41421356237310

In [5]: if (isinstance(x, sympy.Basic)):
   ...:     print(x.n())
   ...:     
1.41421356237310

答案 1 :(得分:1)

这个怎么样:

isinstance(z, tuple(sympy.core.all_classes))

答案 2 :(得分:0)

嘿,在一天结束时,事实证明你可以使用python的原生浮点转换功能将一个sympy对象转换为float!我不知道为什么我没有立即尝试......

>>> import sympy
>>> x = sympy.sqrt(2)
>>> float(x)
1.4142135623730951

我将使用它,因为即使x是python int或已经是python float它也可以工作