2011-01-06 122 views
3

我覺得必須有一些簡單的東西,我在這裏想念。 這是我想做的事:如何編寫一個Python函數來接受*參數和關鍵字參數?

>>> def x(*args, a=False): 
... print args, a 

>>> x(1,2) 
(1,2) False 

>>> x(1,2,3, a=True) 
(1,2,3) True 

但你不能這樣定義一個函數。

我知道這會工作,但它似乎並不漂亮:

>>> def x(*args, **kwargs): 
... if 'a' in kwargs: 
...  a = kwargs['a'] 
... else 
...  a = False 
... print args, a 

什麼是做到這一點的最好方法是什麼?
我正在使用python 2.6

+1

我知道你正在使用2.6,但如果這是一個簡單的腳本,我不知道是否有可能將其移動到3.0。我剛剛在3.2中測試了你的確切代碼,它完美地工作(可能是因爲Py3的'頭部'和'尾部'的概念,這非常棒) – jonesy 2011-01-06 04:22:31

回答

5

我覺得你有什麼是唯一的出路。但是你可以把它寫漂亮:

def x(*args, **kwargs): 
    a = kwargs.get('a', False) 
    print args, a 

x(1,2,3,a=42) 
+0

我可能誇大了這個選擇有多難看:p – Jake 2011-01-06 04:13:19

+0

你可能想在'kwargs'中加入'assert'a'之類的東西,'a'是必須的''或'如果'a'不是kwargs:raise TypeError(「x採用一個關鍵字參數,沒有給出」)來幫助調試問題。 – 2011-01-06 11:22:25

0

那麼所有*參數真的是一個變量列表的參數和所有** kwargs真的是一個字典關鍵字只有參數。

除非我誤解,爲什麼不這樣做呢?

def x(args, a=False): 
    print args, a 

x((1,2),True) #<- just passes in a list instead of special list and dict 

output 
(1,2) True 

x((1,2)) 

output 
(1,2) False 

不無變量*參數列表和檢測的** kwargs關鍵字參數僅作爲字典Python的,但可能適用於您的需求。

+0

這是我想到的最好的解決方案,但希望有更好的東西。 – Jake 2011-01-06 04:11:10

0

所以用默認的參數至上你要麼必須把你的第二個選擇,或者你必須重新排序參數:

def x(a=False, *args): 
+1

考慮到,但我不得不調用'x(False,1,2,3)'而不是'x(1,2,3)',在這種情況下,它可能是'def x(a, * args):' – Jake 2011-01-06 04:12:30

3

剛剛發現這個http://www.python.org/dev/peps/pep-3102/

的第一個變化是,允許定期 參數的可變參數 爭吵後出現:

def sortwords(*wordlist, case_sensitive=False): 
    ... 

此功能接受任意數量的 位置參數,並且它還接受一個名爲0的關鍵字選項'case_sensitive'。

所以它的未來在Python 3

+2

FWIW,Python 3在這裏,如果你可以使用它。 – aaronasterling 2011-01-06 04:22:18

相關問題