2012-04-05 36 views
0

所以,如果我有一个函数,该函数的命名参数负荷:蟒蛇命名参数的自动命名

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

为什么不简单地'foo(e = 0,b = 0,d = 0,a = 0,c = 0)'? – 2012-04-05 16:39:56

+0

,因为a,b等可能会在条件等内定义。 – Ferguzz 2012-04-05 16:40:56

+1

您可以更改foo吗? – 2012-04-05 16:42:16

回答

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写了一个使用较少参数的包装器。

+7

是的,你*可以*做到这一点,但有人可能会杀了你。 – 2012-04-05 16:51:14

+0

此外,这使用'** kwargs'的许多现实世界的功能。 – 2012-04-05 16:51:59

+0

谢谢。我想我会坚持查找订单! – Ferguzz 2012-04-05 16:52:13

0

你可以做到以下几点:

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

a = 11 
b = 22 
c = 33 

func(**locals()) 
+0

OP不能分别改变'foo()'(或'func()')。 – 2012-04-05 16:53:18

3

Python的参数传递机制非常灵活。如果他们不够灵活,这似乎是一个设计的味道,我...

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

  • 可能的气味:坏变量名称。解决方案:给变量更多描述性名称。

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

+0

他说他没有写这个功能。 – georg 2012-04-05 16:55:03

+0

@ thg435他/她仍然可以改进'foo'外部的变量名称* – 2012-04-05 16:56:03

3

如果更改函数不是您的选择,但您可以自由更改将值分配给传递参数的方法,下面是一个示例代码,可能对您有所帮助。这曾经orderdict到preserv的

鉴于

>>> 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. 而且您甚至不必将变量作为参数传递。只要通过字典。
0

每次调用一个完全不同的参数集的5参数函数是非常罕见的。如果在实践中大部分时间使用相同的a,c和e参数,并且使用不同的b和d参数(例如)进行呼叫,则可以创建一个类来帮助您:

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) 
+2

这基本上是'functools.partial'的作用。 – georg 2012-04-05 18:02:18