确定调用了哪个函数

时间:2012-04-03 19:53:30

标签: python function

def f():
   return


g=f

g.func_name是“f”

我如何获得“g”?

4 个答案:

答案 0 :(得分:6)

You can't.

编辑: 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']