如何覆盖sympy.core.numbers.Float的__str__方法?

时间:2017-04-11 03:34:01

标签: python sympy

我试图通过使用不同的数字层次结构来克服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'

我怎样才能克服这个?

3 个答案:

答案 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)