Python 我能知道函数是直接调用的还是通过指定的变量调用的吗
假设我有一个函数Python 我能知道函数是直接调用的还是通过指定的变量调用的吗,python,python-2.7,Python,Python 2.7,假设我有一个函数def():打印0,我想创建另一个函数g,但是g的实现与f相同,所以我只将f分配给它: def f(): print 0 g = f 您可能会问,如果它们相同,为什么要使用两个函数,这是因为从逻辑上讲,它们代表两个不同的东西 现在,我能知道谁被叫了吗?我只想在通过g调用时调试f()。这两个调用之间的流是否不同 dup的建议与我的问题无关。我知道函数名,因为只有一个函数存在。我只是希望更进一步,了解是否触发了与函数名具有相同值的变量…如果没有其他帮助或代码分析,就无法实现
def():打印0
,我想创建另一个函数g
,但是g
的实现与f
相同,所以我只将f
分配给它:
def f():
print 0
g = f
您可能会问,如果它们相同,为什么要使用两个函数,这是因为从逻辑上讲,它们代表两个不同的东西
现在,我能知道谁被叫了吗?我只想在通过g
调用时调试f()。这两个调用之间的流是否不同
dup的建议与我的问题无关。我知道函数名,因为只有一个函数存在。我只是希望更进一步,了解是否触发了与函数名具有相同值的变量…如果没有其他帮助或代码分析,就无法实现这一点
即使堆栈也不知道被调用的名称:
>>> def a(): traceback.print_stack()
...
>>> b = a
>>> a()
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in a
>>> b()
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in a
>>>
def a():traceback.print_stack()
...
>>>b=a
>>>()
文件“”,第1行,在
文件“”,第1行,在
>>>b()
文件“”,第1行,在
文件“”,第1行,在
>>>
不,您不能,至少不能这样做,因为Python不会跟踪“查看哪个对象引用”。我强烈建议您制作另一个包含f
的函数g
,以减少痛苦的调试体验
但是,如果您的代码遵循某些模式,您可以查看inspect.stack()
:
幸运的是,你会成功的
f()
g()
如果您有一些正则表达式技能,实际上可以使用一个来提取函数名:
import re
func_name_re = re.compile(r"\b(\w+)\s*\()")
line = "f()"
print(func_name_re.search(line).group(1))
但是,如果调用代码变得稍微复杂一些,则很容易在识别实际函数时遇到问题:
some = f(g())
some[f()] = g()
some = f("aaa g() sss") # string content looks like function call
some = re.compile(r"^f(?!$)", flags=g()) # same as above
在上述所有示例中,您很难确定它是f
还是g
这不起作用
输入:
def f():
pass
g = f
print(f.__name__)
print(g.__name__)
print(id(f))
print(id(g))
f
f
4350036880
4350036880
输出:
def f():
pass
g = f
print(f.__name__)
print(g.__name__)
print(id(f))
print(id(g))
f
f
4350036880
4350036880
我能想到的唯一解决办法是围绕调用eval的函数创建某种类型的包装器,并以这种方式进行处理(但很可能对您想要做的事情没有意义)。然后可以使用func_name参数调用该包装器
func_name = 'f'
if func_name =='f':
## you know f was called
eval('f()')
我能提出最简单的解决办法吗
def f():
print 0
def g():
return f()
现在你清楚地知道什么时候通过
g
调用f
-你只需要检查调用堆栈。恐怕不行。@meowgoes重复的狗是无效的,因为g.\uu name\uuu==“f”
其中预期的结果是“g”
@iBug啊,好吧,我误解了这个问题,我将避免像这样的暴行(g(h())@CIsForCookies好吧,不过,如果出于调试目的需要,我建议您将其打包。但无论如何,我的解决方案应该适用于简单的情况。eval()是EviLi同意的。只是把一个想法扔掉。我同意这是一个很好的设计决策,但这并不能回答OPS问题。@ USE2263572取决于你认为哪个部分是“问题”。它不回答问题的标题,而是完美地解决最终的问题。“现在,我能知道谁被调用了吗?我只想在通过g”one;-)调用f()时调试它。这实际上是一个非常简单和好的解决方案。我爱上了将函数分配给变量的能力,并监督了基本功能。。。