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
我在这里写了一个基于跑步的答案。我们不能给函数指定一个新名称,但它做了我想做的事情
是的,有一种方法可以做到这一点,但要把它做好会很棘手。您可以使用^{} 模块来访问调用堆栈。这使您可以看到调用函数的代码是什么样子的。在
堆栈如下所示:
注意倒数第二个条目:
['func()\n']
。这显示了调用函数的代码。即使函数的名称显示在堆栈中的其他位置,它始终显示函数的实际名称,不管如何调用它。因此,您必须自己做一些工作来确定调用是直接进行的还是通过指定的变量进行的。在这是获取函数名的唯一方法。Pythondoes not have a feature从函数本身中检索函数名。在
为了说明这将比
^{pr2}$if func_name in stack
更困难,我对函数进行了一些充实,以展示几个实际的示例,说明如何调用函数以及它的外观。因为函数不能确定它自己的名称,所以它被硬编码在函数的顶部。在打印:
相关问题 更多 >
编程相关推荐