我试图通过使用不同的数字层次结构来克服Python的浮点子类的缺陷。但是以下代码:
from sympy import *
import sympy.core.numbers
f = 1.123456789
n = N(f, 8)
print n
print type(n)
sympy.core.numbers.Float.__str__ = lambda f: "{:.8f}".format(f)
print n
产生错误:
AttributeError:'module'对象没有属性'numbers'
我怎样才能克服这个?
答案 0 :(得分:3)
这可以满足您的需求:
<强>代码:强>
from sympy.core.numbers import Float
Float.__str__ = lambda f: "{:.8f}".format(float(f))
测试代码:
from sympy import N
from sympy.core.numbers import Float
f = 1.123456789
n = N(f, 8)
Float.__str__ = lambda f: "{:.8f}".format(float(f))
print n
<强>结果:强>
1.12345679
答案 1 :(得分:1)
在这种情况下,Monkeypatching __str__
是不好的做法,因为SymPy已经通过子类化打印机来修改SymPy对象的打印方式。在这里,我采取并修改了原始的sympy.printing.str.StrPrinter._print_Float
。
from sympy.printing.str import StrPrinter
class MyStrPrinter(StrPrinter)
def _print_Float(self, expr):
return '{:.8f}'.format(expr)
然后使用MyStrPrinter().doprint
代替str
。您也可以通过
str
本身使用它
from sympy import init_printing
init_printing(pretty_print=False, str_printer=MyStrPrinter().doprint)
答案 2 :(得分:0)
由于一些错误的名称选择,sympy.core.core
子模块将通过&#34; real&#34; sympy.core
子包,因此尝试访问sympy.core
会使您sympy.core.core
,并且尝试访问sympy.core.numbers
会获得AttributeError
。
您可以通过多种方式解决此问题。 SymPy提供对所需类sympy.Float
的访问权限,例如:
import sympy
do_whatever_with(sympy.Float)