python命名参数自动命名

时间:2012-04-05 16:37:52

标签: python argument-passing

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

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

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

a = 0
b = 0
c = 0
d = 0
e = 0

有没有办法避免这样做?

foo(e = e, b = b, d = d, a = a, c = c)

然后这样做:

foo(e, b, d, a, c)

我想我可以这样做:

foo(a, b, c, d, e)

但是,如果参数的名称复杂,我不记得它们的顺序呢?

5 个答案:

答案 0 :(得分: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])

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

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

foo(**foo_params)

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

答案 1 :(得分:3)

Python的参数传递机制非常灵活。如果它们不够灵活,这对我来说就像是一种设计气味......

  • 可能的气味:函数的参数太多。解决方案:分成多个函数,在字典或对象中将一些args传递到一起。

  • 可能的气味:错误的变量名称。解决方案:为变量提供更具描述性的名称。

或者只是咬紧牙关,找出正确的顺序,并保持简单。

答案 2 :(得分:3)

如果更改函数不是您的选项,但您可以自由更改为传递的参数赋值的方法,这里有一个可能对您有帮助的示例代码。这使用了orderdict来保存

鉴于

>>> def foo(a = 1, b = 2, c = 3, d = 4, e = 5):
    print "a={0},b={1},c={2},d={3},e={4}".format(a,b,c,d,e)
你可以做到

>>> var=dict()
>>> var['c']=12
>>> var['a']=10
>>> var['b']=11
>>> var['e']=14
>>> foo(**var)
a=10,b=11,c=12,d=4,e=14

注意,这个答案类似于@ thg435提出的答案,但你是

  1. 不使用inspect来破解函数所期望的参数。
  2. 不浏览本地/全球词典。
  3. 支持缺少的参数,默认为默认参数。
  4. 当然,您不必记住订单。
  5. 你甚至不必将变量作为参数传递。只需通过字典。

答案 3 :(得分:0)

您可以执行以下操作:

def func(a=1, b=2, c=3, **kw):
    print a,b,c

a = 11
b = 22
c = 33

func(**locals())

答案 4 :(得分:0)

每次使用完全不同的参数集调用5参数函数非常罕见。实际上,如果您在大多数时间使用相同的a,c和e args并使用不同的b和d args(例如)调用,则可以创建一个类来帮助您:

class FooWrapper(object):
    def __init__( self, commonA, commonC, commonE ):
        self.a = commonA
        self.c = commonC
        self.e = commonE

    def invokeFoo( self, _b, _d ):
        foo( a=self.a, b = _b, c = self.c, d = _d, e = self.e )

w = FooWrapper( 1, 2, 3 )
w.invokeFoo( 4, 5 )          # calls foo( 1, 4, 2, 5, 3 )
w.invokeFoo( 6, 7 )          # calls foo( 1, 6, 2, 7, 3 )