Python:如何在CORRECT ORDER中打印函数的参数

时间:2014-03-17 20:13:27

标签: python arguments

我试图在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)

由于

1 个答案:

答案 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函数。