def f():
return
g=f
g.func_name是“f”
我如何获得“g”?
答案 0 :(得分:6)
编辑: gc.get_referrers
存在,但不会告诉您对函数对象的哪个引用用于调用它,因此它对您没有帮助。此外,使用该功能时有一些警告,我不知道它是否在CPython以外的实现下工作。不鼓励在生产代码中使用它。
作为最后一点,虽然常见问题解答可能不完全正确,您是否可以确定对象的名称,但是您
答案 1 :(得分:2)
当 def 创建 f 时,会同时创建 __ 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']
答案 2 :(得分:1)
您可以通过使用inspect
模块检查源代码来执行此操作,然后只有一些限制(至少,您需要能够获取名称所在的行)提到的问题)。
除非你真的知道为什么需要它,否则你绝对不应该这样做。
答案 3 :(得分:1)
a = 1
b = 1
c = 1
1的名称是什么?这个问题是否有意义?
函数是与任何其他对象一样的对象,例如1
或"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']