我试图找出如何获取我已分配给方法的变量名称,例如:
import inspect
def a():
print inspect.stack()[0][3]
b = a
b()
这将返回a
而不是b
,如果我使用[1][3]
作为索引,它会给我<module>
。我期待得到b
。这有什么简单的pythonic解决方案吗?我是否必须创建装饰器和包装器才能得到它?。
答案 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
很难可靠地解析它。