Sympy __repr__ magic - 它是如何工作的?

时间:2017-12-28 18:42:49

标签: python sympy

我注意到在调用init_printing sympy方法之后,变量的表示具有更好的视觉吸引力。我知道这通常是继承repr方法。

但是当我调用__repr__方法时,结果会有所不同。为什么?

在调用init_printing之前,结果如下:

>>> import sympy as sy
>>> x = sy.Symbol('x')
>>> sy.exp(x)
exp(x)

>> sy.exp(x).__repr__()
'exp(x)'

调用init_printing后,结果如下:

>>> import sympy as sy
>> sy.init_printing()
>>> x = sy.Symbol('x')
>>> sy.exp(x)
 x
e

>> sy.exp(x).__repr__()
'exp(x)'

为什么 repr 方法不会返回与评估变量表示形式相同的内容?

>>> sy.exp(x).__repr__
<bound method Basic.__repr__ of exp(x)>

1 个答案:

答案 0 :(得分:3)

该函数安装了一个自定义sys.displayhook() function,它在交互式解释器中用于回显表达式的结果:

  在评估在交互式Python会话中输入的表达式的结果上调用

sys.displayhook。可以通过为sys.displayhook指定另一个单参数函数来自定义这些值的显示。

实施可在sympy.interactive.printing module

中找到
def _init_python_printing(stringify_func, **settings):
    """Setup printing in Python interactive session. """
    import sys
    from sympy.core.compatibility import builtins

    def _displayhook(arg):
        """Python's pretty-printer display hook.
           This function was adapted from:
            http://www.python.org/dev/peps/pep-0217/
        """
        if arg is not None:
            builtins._ = None
            print(stringify_func(arg, **settings))
            builtins._ = arg

sys.displayhook = _displayhook

换句话说,这与对象如何实现__repr__无关。