2015-02-17 37 views
1

因此,可以說我有一個功能:如何默認爲默認參數在Python

def print_something(a, b, c='something', d='something else'): 
    print '{}/{}/{}/{}'.format(a, b, c, d) 

而且我有這個方法:

def print_method(self, a, b): 
    if self.c and self.b: 
     print_something(a, b, self.c, self.d) 
    elif self.c: 
     print_something(a, b, c=self.c) 
    elif self.d: 
     print_something(a, b, d=self.d) 
    else: 
     print_something(a, b) 

有沒有辦法讓與print_method()相同的功能,而不必爲每個可能的self.c和self.d組合提供if。

+0

什麼是self.c和self.b? – 2015-02-17 22:12:16

+0

他們可能是很多事情。可能是最初是空的但可能被追加到的字符串。 – j0eb 2015-02-17 22:16:28

回答

4

您可以將字典傳遞給包含關鍵字參數名稱和值的函數調用。所以,這樣的事情應該工作:

kwargs = dict((k, getattr(self, k)) for k in ('c', 'd') if getattr(self, k)) 
print_something(a, b, **kwargs) 
-1

你可以在這裏使用**args

def print_method(self, a, b): 
    extra_args = {} 
    if self.c: 
     extra_args['c'] = self.c 
    if self.d: 
     extra_args['d'] = self.d 
    print_something(a, b, **extra_args) 

這就要求print_something()你所擁有然而,許多額外的參數。

+3

這不會做正確的事情。因爲如果self.d被設置,但self.c不是,在位置上,c將被分配self.d,這似乎與提問者所期望的相反。 – jgritty 2015-02-17 22:02:29

+0

@jgritty:謝謝,修正。 – Kevin 2015-02-18 03:36:25

2

你可以改變你的其他功能設置值空字符串所以默認將被使用,除非我們得到通過非空字符串:

def print_something(a, b, c="", d=""): 
    c = 'something' if not c else c 
    d = 'something else' if not d else d 
    print('{}/{}/{}/{}'.format(a, b, c, d)) 

def print_method(self, a, b): 
     print_something(a, b, self.c, self.d) 

或者更簡明地爲你考慮任何falsey值是假的如果您的班級中有我們可以使用的支票c = c or default

def print_something(a, b, c="", d=""): 
    c = c or 'something' 
    d = d or 'something else' 
    print('{}/{}/{}/{}'.format(a, b, c, d)) 
+1

我總是喜歡更簡潔的'c = c或'something''的表述。 – acushner 2015-02-17 22:37:04

+0

@acushner,是的,當我使用它的時候,我有一點心理障礙,但是它會起作用,我會加上它 – 2015-02-17 22:39:29

+1

我覺得'x if x else y'構造更加習慣。 – 2015-02-17 22:42:44