2017-12-28 12 views
1

私はinit_printing sympyのメソッドを呼び出した後、変数の表現がより視覚的に魅力的であることに気付きました。私はそれが通常reprメソッドを継承して行われることを知っています。Sympy __repr__魔法 - どのように動作しますか?

しかし、__repr__メソッドを呼び出すと、結果が異なります。どうして?呼び出されinit_printing

が、これが結果です:init_printing

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

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

が呼び出され、これが結果です:

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

答えて

3

この関数は、式の結果をエコーする対話インタプリタで使用されるカスタムsys.displayhook() functionを、インストールします。

sys.displayhookは、Pythonの対話セッションで入力された式を評価した結果で呼び出されます。これらの値の表示は、別の1引数の関数を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__を実装する方法とは何の関係もありません。

+0

sys.displayhookの存在を知らなかった。ありがとうございました。 –

関連する問題