Python 确定调用了哪个函数

Python 确定调用了哪个函数,python,function,Python,Function,g、 func_的名字是f 我怎样才能得到g EDIT:存在,但不会告诉您调用函数对象时使用了哪个函数对象引用,因此它对您没有帮助。此外,在使用该函数时还有一些注意事项,我不知道它是否在CPython以外的实现下工作。不鼓励在生产代码中使用它 最后一点,虽然FAQ对于您是否可以确定对象的名称可能并不完全正确,但它对您是否应该全神贯注的见解。当def创建f时,同时会创建_名称_;属性。该属性被指定给函数对象,并且无论您随后将函数指定给什么,该属性都将持续存在 一般来说,对象不知道它指向哪些变量 但

g、 func_的名字是f

我怎样才能得到g

EDIT:存在,但不会告诉您调用函数对象时使用了哪个函数对象引用,因此它对您没有帮助。此外,在使用该函数时还有一些注意事项,我不知道它是否在CPython以外的实现下工作。不鼓励在生产代码中使用它

最后一点,虽然FAQ对于您是否可以确定对象的名称可能并不完全正确,但它对您是否应该全神贯注的见解。

当def创建f时,同时会创建_名称_;属性。该属性被指定给函数对象,并且无论您随后将函数指定给什么,该属性都将持续存在

一般来说,对象不知道它指向哪些变量

但是,我们确实有gc.get_referers之类的工具,而不是使用特定于实现的逻辑来查找对对象的所有引用:

def f():
   return


g=f
另一种技术是扫描命名空间以查找特定对象的所有实例:

>>> def f(x):
    return x**2

>>> g = f

>>> import gc
>>> gc.get_referrers(f)[0].keys()
['g', 'f', '__builtins__', '__package__', 'gc', '__name__', '__doc__']

您可以通过使用inspect模块检查源代码来实现这一点,并且只有在至少有一些限制的情况下,您才需要能够获得提到该名称的行

除非你真的知道你为什么需要它,否则你绝对不应该那样做

>>> [key for key, value in globals().items() if value == f]
['g', 'f']
1的名字是什么?这个问题有意义吗

函数是与任何其他对象类似的对象,例如1或cats。它有一个_name _属性,告诉您最初定义它的名称,但是可以为它指定其他名称,并且这些指定的对象上不保留任何记录

您可以搜索所有局部和全局变量,但这不会找到所有可能的引用;对函数的引用可以保存在诸如字典或列表之类的容器中,作为对象属性,作为其他模块中的全局变量,也可能是我现在没有想到的其他地方。哦关闭。不过,这是要点:

a = 1
b = 1
c = 1

不管有没有解决方案,你为什么首先需要这个?简短的回答:你不能。同样在lambdas的情况下,他们除了名字之外没有名字。lambda与普通函数共享类型,至少在CPython:types.FunctionType==types.lambdaypenice答案中是这样,只是它不是一个真正正确的答案。你真的可以。你是否应该是另一回事-重新编辑答案以反映这一点。我不知道gc.get\u referers,但我认为您仍然无法判断调用它时使用了哪个函数引用。在谈论Python时,can't是一个危险的词;-查看sys.\u getframe并思考跟踪、分析和pdb是如何工作的。Python有很多方法可以进行内省。因此,在谈论Python这样的CAN-DO语言时,您应该犹豫是否使用CAN-Not这个词。说吧-这将查找函数的所有名称,而不是查找问题标题中所述的函数调用的名称,或者我是否遗漏了什么?。当然,可能对OP仍然有用。
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']