打印传递给函数的参数

0 投票
2 回答
1637 浏览
提问于 2025-04-17 23:01

有没有一种比较“python风”的方法,可以打印出传给一个函数的所有参数?

我有一个像下面这样的函数……

def modify_setting(self, keyword, method=None, value=None, limit=None, parameter=None):

当我调用这个函数时,并不是每个参数我都会传值。我想到的就是逐个详细地调用每个参数,像下面这样,但这样做的结果并不是我想要的。

print "{} Modified: {}, {}, {}, {}".format(keyword,  method, value, limit, parameter)

结果:

Acquisition Mode Modified: Static, 10, None, None

我想要的(或者类似的):

Acquisition Mode Modified: Static, 10

2 个回答

1

你可以使用装饰器——我觉得装饰器在Python中很常见:

def dump_args(func):
    "This decorator dumps out the arguments passed to a function before calling it"
    argnames = func.func_code.co_varnames[:func.func_code.co_argcount]
    fname = func.func_name

    def echo_func(*args,**kwargs):
        print fname, ":", ', '.join(
            '%s=%r' % entry
            for entry in zip(argnames,args) + kwargs.items())
        return func(*args, **kwargs)

    return echo_func

@dump_args
def f1(a,b,c):
    print a + b + c

>>> f1(1, 2, 3)
f1 : a=1, b=2, c=3
6
>>>

@dump_args
def f2(a, b = None, c = None):
    print '{}/{}/{}'.format(a, b, c)

>>> f2(1, c = 3)
f2 : a=1, c=3
1/None/3
>>>

装饰器的相关内容可以在这里找到: https://wiki.python.org/moin/PythonDecoratorLibrary

1

如果你所有的默认值都是 None,那么你可以直接打印那些不是 None 的变量:

print "{} Modified: {}".format(keyword,  method, ", ".join( [str(v) for v in (value, limit, parameter) if not v is None]))

你可以把代码写得更清晰一些:

vars= (value, limit, parameter)
vars_str= ", ".join( [str(v) for v in vars if not v is None]
print "{} Modified: {}".format(keyword,  method, vars_str)

撰写回答