python命名参数自动命名

Fer*_*uzz 0 python argument-passing

所以如果我有一个带有大量命名参数的函数:

def foo(a = 1, b = 2, c = 3, d = 4, e = 5) # etc...
    pass
Run Code Online (Sandbox Code Playgroud)

我用所有与定义名称完全相同的参数调用它:

a = 0
b = 0
c = 0
d = 0
e = 0
Run Code Online (Sandbox Code Playgroud)

有没有办法避免这样做?

foo(e = e, b = b, d = d, a = a, c = c)
Run Code Online (Sandbox Code Playgroud)

并且这样做:

foo(e, b, d, a, c)
Run Code Online (Sandbox Code Playgroud)

我想我可以这样做:

foo(a, b, c, d, e)
Run Code Online (Sandbox Code Playgroud)

但如果争论的名字复杂,我不记得他们的顺序呢?

geo*_*org 5

好吧,你可以这样做:

def foo(a, b, c, d):
    print a, b, c, d


d = 4
b = 2
c = 3
a = 1

import inspect
foo(*[locals().get(arg, None) for arg in inspect.getargspec(foo).args])
Run Code Online (Sandbox Code Playgroud)

但我不确定我能推荐这个......在实践中我会使用一个参数字典:

foo_params = {
    'd' : 4,
    'b' : 2,
    'c' : 3,
    'a' : 1
}

foo(**foo_params)
Run Code Online (Sandbox Code Playgroud)

写一个foo使用较少参数的包装器.

  • 是的,你*可以*那样做,但是有人可能不得不杀了你. (7认同)