2011-02-02 6 views
2

すべての名前付きパラメータがメソッドに渡されていることを確認する必要があります(デフォルトは不要です)。それを実行するには、以下の方法が最善の方法ですか?python:関数パラメータの検証

class X: 
    def func(self, **kwargs): 
    if set(kwargs.keys() != ('arg1', 'arg2', 'arg3'): 
     raise ArgException(kwargs) 
+1

発生している例外がTypeErrorのサブクラスであることを確認してください。なぜあなたはこれをやりたいのですか?変数を普通に指定するだけです。 –

+0

悪い、悪いデザイン。 'def func(self、arg1、arg2、arg3)'を使ってください。 –

+0

@S Lott私はあなたの提案を使用しますが、引き続き議論の順番で間違いを犯します。 @Glenn Maynard私は順序のミスを避けるために名前付きのパラメータを使用していました(私は多くの関数で3〜6引数を持っています)。良くない? – max

答えて

5

を、ヒューの答えは(すなわち、単に名前の位置引数を使用します)あなたの最善の策です。 Python 3.xのために、あなたも(むしろ単にそれを許すより)キーワード引数の使用を必要とのオプションを持って

は次のとおりです。

class X(object): 
    def func(self, *, arg1, arg2, arg3): 
     pass 
+0

+1: '*'強制的なキーワード引数について知りませんでした。 – max

3
class X(object): 
    def func(self, **kwargs): 
     required = set(['arg1','arg2','arg3']) 
     if not set(kwargs.keys()).issuperset(required): 
      raise ArgException(kwargs) 

あなただけのインタプリタがそれの世話を聞かせができるが:Pythonの2.xのために

class X(object): 
    def func(self, arg1, arg2, arg3): 
     pass 
+0

+1 ..はい、私のコメントを参照してください質問。どのように私がそれを知らなかったのか分かりません。 – max

0

あなたは他の引数を許可しますか?そうでない場合:

class X(object): 
    def func(self, arg1, arg2, arg3): 
     pass 

はい:Pythonのすべてのバージョンのためだ

class X(object): 
    def func(self, arg1, arg2, arg3, **kwargs): 
     pass 

関連する問題