def f():
return
g=f
g.func_name 是“f”
我如何得到“g”?
编辑: gc.get_referrers
存在,但不会告诉你哪个函数对象的引用被用来调用它,所以它对你没有帮助。此外,使用该函数时有一些注意事项,我不知道它是否适用于 CPython 以外的实现。不鼓励在生产代码中使用它。
最后一点,尽管关于您是否可以确定对象名称的常见问题解答可能并不完全正确,但它对您是否应该死心塌地的见解。
当f由def创建时,同时创建__name__属性。该属性被分配给函数对象,并且无论您随后将函数分配给什么,它都会持续存在。
通常,对象不知道它指向哪些变量。
但是,我们确实有像 gc.get_referrers() 这样的工具,而不是使用特定于实现的逻辑来查找对对象的所有引用:
>>> def f(x):
return x**2
>>> g = f
>>> import gc
>>> gc.get_referrers(f)[0].keys()
['g', 'f', '__builtins__', '__package__', 'gc', '__name__', '__doc__']
另一种技术是扫描命名空间以查找特定对象的所有实例:
>>> [key for key, value in globals().items() if value == f]
['g', 'f']
您可以通过使用inspect
模块检查源代码来做到这一点,并且只有在某些限制下(至少,您需要能够获得提到相关名称的行)。
你绝对不应该这样做,除非你真的知道你为什么需要它。
a = 1
b = 1
c = 1
1的名字是什么?这个问题还有意义吗?
函数是与任何其他对象一样的对象,例如1
or "cats"
。它有一个__name__
属性可以告诉你它最初被定义为什么名称,但可以为它分配其他名称,并且在这些分配的对象上不保留任何记录。
您可以搜索它的所有局部和全局变量,但这不会找到所有可能的引用;对函数的引用可以保存在诸如字典或列表之类的容器中,作为对象属性,作为其他模块中的全局变量,可能还有我现在没有想到的其他地方。哦!关闭。不过,这是要点:
def f():
pass
g = f
allvars = dict(globals())
allvars.update(locals())
funcnames = [key for (key, value) in allvars.iteritems() if value is f]
# returns ['g', 'f']