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()时调试它。这实际上是一个非常简单和好的解决方案。我爱上了将函数分配给变量的能力,并监督了基本功能。。。