2011-02-02 80 views
2

我需要確保所有命名參數傳遞給一個方法(我不想任何默認值)。以下是執行它的最佳方式嗎?python:驗證函數參數

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

確保您引發的異常是TypeError的子類。如果你想這樣做,你爲什麼要使用kwargs?只需正常指定變量。 – 2011-02-02 04:15:19

+0

糟糕,糟糕的設計。使用`def func(self,arg1,arg2,arg3)`。 – 2011-02-02 11:07:50

+0

@S洛特我會使用你的建議,但是我會一直以參數的順序犯錯誤。 @Glenn Maynard我使用命名參數只是爲了避免錯誤(我的許多函數有3-6個參數)。不好? – max 2011-02-02 18:57:06

回答

5

對於Python 2.x中,休的答案(即只使用命名位置參數)是你最好的選擇。

對於Python 3.x的,你也有選項需要使用的關鍵字參數(而不是僅僅允許它)如下:

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

雖然你可以只讓翻譯照顧它:

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

你要允許其他參數?如果不是:

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

如果是:

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

這是爲Python的所有版本。