我试图在Python中编写一个函数,无论何时在另一个函数中调用,比如f
,它都会打印函数的名称,该函数的名称与调用它的参数有关。据我所知,sys
可以导入,sys._getframe(1).f_code.co_name
是带有函数名称的字符串,sys._getframe(1).f_locals
是包含变量名称和值的字典。这个问题似乎已经解决了,但是关于论点的一个小问题困扰着我。说我有
import sys
def f(a,b,c=0):
print sys._getframe(1).f_locals
然后调用f(1,2,3)
打印{'a': 1, 'c': 3, 'b': 2}
,这确实是正确的。问题是在条目'c'
之前列出了字典条目'b'
,因此如果我用.values()
提取字典的值,它们将以错误的顺序打印。我的完整示例类似于
import sys
def caller():
""" Prints name and args of the calling function, e.g. f(1,2,3)"""
print sys._getframe(1).f_code.co_name, tuple(sys._getframe(1).f_locals.values())
def f(a,b,c=0):
caller()
调用f(1,2,3)
而不是打印f(1,2,3)
打印f(1,3,2)
。为什么订单搞砸了,我该如何纠正呢?
此外,有没有办法不打印未明确指定的默认参数?例如,在上面的示例中,我希望f(1,2,3)
打印f(1,2,3)
和f(1,2)
来打印f(1,2)
而不是f(1,2,0)
。
由于
答案 0 :(得分:3)
这是按顺序排列的最佳方式,list
tuples
:
>>> import inspect
>>> def name_and_args():
... caller = inspect.stack()[1][0]
... args, _, _, values = inspect.getargvalues(caller)
... return [(i, values[i]) for i in args]
...
>>> def f(a, b, c):
... print(name_and_args())
...
>>> f(1, 2, 3)
[('a', 1), ('b', 2), ('c', 3)]
所以,只需在name_and_args
中调用每个函数中的f
函数。