函数能知道它是如何被调用的吗?

2024-04-26 00:21:44 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以知道函数是由它自己调用的还是分配给了一个带有=?在

我想这样做:

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

这将使这些产出:

^{2}$

Tags: 方法函数returnifdefwithnotequal
2条回答

我在这里写了一个基于跑步的答案。我们不能给函数指定一个新名称,但它做了我想做的事情

import inspect

# generator function to get all the strings in an iterable object
def descend_strings(obj):
    if hasattr(obj,'__iter__'):
        if type(obj)==dict:
            for key in obj:
                for result in descend_strings(obj[key]):
                    yield result
        else:
            for item in obj:
                for result in descend_strings(item):
                    yield result
    if type(obj)==str:
        yield obj

def func():
    stack = inspect.stack()

    joined_flat_stack_str = ''.join(list(descend_strings(stack)))

    if ('= func()' in joined_flat_stack_str) or ('print func()' in joined_flat_stack_str):
        return 5
    else:
        print 'not assigned'


func()       # 'not assigned'
a = func()   
print a      # 5
print func() # 5

x = func
x()          # 'not assigned'
a = x()      # 'not assigned'
print a      # None

是的,有一种方法可以做到这一点,但要把它做好会很棘手。您可以使用^{}模块来访问调用堆栈。这使您可以看到调用函数的代码是什么样子的。在

堆栈如下所示:

[(<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']。这显示了调用函数的代码。即使函数的名称显示在堆栈中的其他位置,它始终显示函数的实际名称,不管如何调用它。因此,您必须自己做一些工作来确定调用是直接进行的还是通过指定的变量进行的。在

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

为了说明这将比if func_name in stack更困难,我对函数进行了一些充实,以展示几个实际的示例,说明如何调用函数以及它的外观。因为函数不能确定它自己的名称,所以它被硬编码在函数的顶部。在

^{pr2}$

打印:

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

相关问题 更多 >