sympyでシンボル名を文字列に変換にする方法を教えて下さい

[code]

    from sympy import *
    var('x y')
    def MYprint(h):
      print('#h=',h)   #この行をどのようになおしたらいいですか？
    f=x+1
    g=y+2
    MYprint(f)
    MYprint(g)
    #WANT f= x + 1
    #WANT g= y + 2
    
[/code]

(参考)シンボルを文字列に変換します。  
<http://ref.xaio.jp/ruby/classes/symbol/to_s>




通常、呼び出し元での引数の変数名は関数内からでは分かりません。ただ、Python には inspect
というモジュールが用意されていますので、これを使って当該の変数名を知ることができます。

**MYprint.py**

[code]

    #!/usr/bin/python3
    
    def MYprint(h):
      import inspect, re
      frame = inspect.getouterframes(inspect.currentframe())[1][0]
      arg_str = inspect.getframeinfo(frame).code_context[0]
      arg = re.search('\((.+?)\)', arg_str).group(1)
      if arg.find('='):
        arg = arg.split('=')[0].strip()
      print('{0} = {1}'.format(arg, h))
    
    
    from sympy import *
    var('x y')
    
    f = x + 1
    g = y + 2
    
    MYprint(f)
    MYprint(g)
    MYprint(h = x ** 2 + 3 * x - 1)
    
[/code]

**実行**

[code]

    $ ./MYprint.py
    f = x + 1
    g = y + 2
    h = x**2 + 3*x - 1
    
[/code]

しかし、

[code]

    MYprint(f + 1)
    
[/code]

などとすると、

[code]

    f + 1 = x + 2
    
[/code]

と表示されてしまいます。

まぁ、MYprint() 関数が変数名(文字列)を受け取る様にするのも考えられますが、

[code]

    def MYprint(h):
      print('{0} = {1}'.format(h, eval(h)))
    
    MYprint('f')
    MYprint('g')
    
[/code]

これなら直接 `print('{0} = {1}'.format('f', f))` とでもする方が良いでしょうね。




通常、呼び出し元での引数の変数名は関数内からでは分かりません。ただ、Python には inspect
というモジュールが用意されていますので、これを使って当該の変数名を知ることができます。

**MYprint.py**

[code]

    #!/usr/bin/python3
    
    def MYprint(h):
      import inspect, re
      frame = inspect.getouterframes(inspect.currentframe())[1][0]
      arg_str = inspect.getframeinfo(frame).code_context[0]
      arg = re.search('\((.+?)\)', arg_str).group(1)
      if arg.find('='):
        arg = arg.split('=')[0].strip()
      print('{0} = {1}'.format(arg, h))
    
    
    from sympy import *
    var('x y')
    
    f = x + 1
    g = y + 2
    
    MYprint(f)
    MYprint(g)
    MYprint(h = x ** 2 + 3 * x - 1)
    
[/code]

**実行**

[code]

    $ ./MYprint.py
    f = x + 1
    g = y + 2
    h = x**2 + 3*x - 1
    
[/code]

しかし、

[code]

    MYprint(f + 1)
    
[/code]

などとすると、

[code]

    f + 1 = x + 2
    
[/code]

と表示されてしまいます。

まぁ、MYprint() 関数が変数名(文字列)を受け取る様にするのも考えられますが、

[code]

    def MYprint(h):
      print('{0} = {1}'.format(h, eval(h)))
    
    MYprint('f')
    MYprint('g')
    
[/code]

これなら直接 `print('{0} = {1}'.format('f', f))` とでもする方が良いでしょうね。

