所以如果我有一个带有大量命名参数的函数:
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)
但是,如果参数的名称复杂,我不记得它们的顺序呢?
答案 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提出的答案,但你是
答案 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 )