2011-01-06 8 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

答えて

5

私は何を持っていることは、唯一の方法だと思います。しかし、あなたはよりよいそれを書くことができます。

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

この機能:

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

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

私は、醜い代替案がどれほど醜いかを誇張しているかもしれません:p – Jake

+0

' 'kwargsに' 'assert 'a'のようなものを追加したい場合は、' 'または' 'a ''がkwargs: TypeError( "xは1つのキーワード引数をとりますが、指定されていません")は、問題のデバッグに役立ちます。 –

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からキーワードのみの引数は、のdictの変数*引数リストと検出なしとして神託のではなく、おそらくあなたのニーズに合わせて動作します。

+0

それは私が考えた最高の解決策でしたが、 – Jake

0

あなたのいずれかは、あなたの2番目の選択肢を取らなければならないか、再オーダーしなければならない引数をデフォルトで引数が最初に来るよう:

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

と考えていますが、 'x(1,2,3)'ではなく 'x(False、1,2,3)'を呼び出す必要があります。この場合、 'def x(a、 * args): ' – Jake

3

ちょうど最初の変更は、通常の 引数が可変引数 引数の後に表示されるようにすることです。このhttp://www.python.org/dev/peps/pep-3102/

を見つけました任意の数の 位置引数を受け取り、 は0というキーワードオプションを受け入れます'case_sensitive'

だから、Pythonの3

+2

FWIWでは、Python 3を使用することができます。 – aaronasterling

関連する問題