Python:将变量名称分配给方法

时间:2014-08-21 07:20:04

标签: python

我试图找出如何获取我已分配给方法的变量名称,例如:

import inspect

def a():
    print inspect.stack()[0][3]

b = a
b()

这将返回a而不是b,如果我使用[1][3]作为索引,它会给我<module>。我期待得到b。这有什么简单的pythonic解决方案吗?我是否必须创建装饰器和包装器才能得到它?。

1 个答案:

答案 0 :(得分:1)

没有(简单)方法可以这样做。

即将放入堆栈帧不是调用函数的名称,而是在函数a.func_code.co_name的代码对象中写入的名称。

无法检测函数的调用方式。您可以尝试检查上面的代码:

将功能更改为

def a():
    return inspect.stack()

我们可以看到

>>> import dis
>>> f=a()[1][0]
>>> dis.dis(f.f_code)
  1           0 LOAD_NAME                0 (a)
              3 CALL_FUNCTION            0
              6 LOAD_CONST               0 (1)
              9 BINARY_SUBSCR
             10 LOAD_CONST               1 (0)
             13 BINARY_SUBSCR
             14 STORE_NAME               1 (f)
             17 LOAD_CONST               2 (None)
             20 RETURN_VALUE
>>> b=a
>>> f=b()[1][0]
>>> dis.dis(f.f_code)
  1           0 LOAD_NAME                0 (b)
              3 CALL_FUNCTION            0
              6 LOAD_CONST               0 (1)
              9 BINARY_SUBSCR
             10 LOAD_CONST               1 (0)
             13 BINARY_SUBSCR
             14 STORE_NAME               1 (f)
             17 LOAD_CONST               2 (None)
             20 RETURN_VALUE
>>> f=[b][0]()[1][0]
>>> dis.dis(f.f_code)
  1           0 LOAD_NAME                0 (b)
              3 BUILD_LIST               1
              6 LOAD_CONST               0 (0)
              9 BINARY_SUBSCR
             10 CALL_FUNCTION            0
             13 LOAD_CONST               1 (1)
             16 BINARY_SUBSCR
             17 LOAD_CONST               0 (0)
             20 BINARY_SUBSCR
             21 STORE_NAME               1 (f)
             24 LOAD_CONST               2 (None)
             27 RETURN_VALUE

很难可靠地解析它。

相关问题