gpt4 book ai didi

python - 一个函数可以知道它是如何被调用的吗?

转载 作者:太空狗 更新时间:2023-10-30 01:26:39 25 4
gpt4 key购买 nike

有没有办法知道函数内部是函数自己调用还是赋值给变量=?

我想做这样的事情:

def func():
if 'assigned with equal':
return 5
else:
print 'not assigned'

这将给出这些输出:

func()
-> 'not assigned'
a = func()
a
-> 5

最佳答案

是的,有一种方法可以做到这一点,但要做到这一点会很棘手。您可以使用 inspect访问调用堆栈的模块。这使您可以查看调用该函数的代码是什么样的。

堆栈看起来像这样:

[(<frame object at 0x107de1d38>, 'path/to/function/file.py', 6, 'func', ['\tstack = inspect.stack()\n'], 0), (<frame object at 0x107d34050>, 'path/to/calling/file.py', 17, '<module>', ['func()\n'], 0)]

注意倒数第二个条目:['func()\n']。这显示了调用您的函数的代码。即使函数名称出现在堆栈的其他位置,它始终显示函数的实际名称,无论它如何被调用。因此,您必须自己做一些工作来确定调用是直接进行的还是通过分配的变量进行的。

这是获取函数名称的唯一方法。 python does not have a feature从函数本身中检索函数名称。

为了清楚地表明这将比 if func_name in stack 更难,我稍微充实了这个函数,以展示几个真实世界的例子来说明一个函数如何可能被称为它会是什么样子。因为函数无法确定自己的名称,所以它被硬编码在函数的顶部。

import inspect


def func(var=None, default=''):
my_name = 'func'
stack = inspect.stack()
func_call = stack[-1][4][0]
print func_call.rstrip() # `func_call` contains a trailing newline

# logic to determine if the name matches
# ...
# ...


x = func
func()
return_value = x(var=1)
print func()
if x():
pass

这打印:

func()
return_value = x(var=1)
print func()
None # This prints from the call, because `func()` doesn't return anything
if x():

关于python - 一个函数可以知道它是如何被调用的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43498607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com