2011-10-02 55 views
3

爲了避免出現明顯的錯誤,我想阻止使用帶有某些函數的位置參數。有什麼辦法可以實現嗎?python:是否有可能要求函數的參數都是關鍵字?

+2

爲什麼這樣做?我們都在這裏同意大人,對吧? – ktdrv

+1

答案其實很簡單:不。我知道,你可能會認爲有一個很棒的用例可以解決一些出色的問題,但相信我,你們正在反對語言的基本哲學 - 我們都贊同成年人。這隻會導致悲傷去追求這樣一個過程。 – cwallenpoole

+0

這聽起來像是一個愚蠢的事情_enforce_。然而,如果你喜歡,你可以養成在函數調用時通過名字指定位置參數的習慣。這樣,如果位置參數的名稱發生變化,調用者將得到一個TypeError(這是你試圖避免的那種明顯的錯誤?)。 – wim

回答

19

只有Python 3中可以適當做(和你使用的python3標籤,所以它的精細):使用**kwargs將讓用戶輸入任何參數,除非你以後檢查

def function(*, x, y, z): 
    print(x,y,z) 

。而且,它會從內省中隱藏真實的參數名稱。

**kwargs不是這個問題的答案。

測試程序:

>>> function(1,2,3) 
Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in <module> 
    function(1,2,3) 
TypeError: function() takes exactly 0 positional arguments (3 given) 
>>> function(x=1, y=2, z=3) 
1 2 3 
2

是的,只需使用**kwargs結構,只從那裏讀取您的參數。

def my_function(**kwargs): 
    for key, value in kwargs.iteritems(): 
     print ("%s = %s" % (key, value)) 

my_function(a="test", b="string") 
+0

不,這將接受任何論點,除非你稍後檢查... – JBernardo

+0

嘿downvoters:可以告訴我這不符合OP的要求?確切的話:「防止使用位置參數」。沒有其他人被指定。 –

6

您可以定義一個裝飾器,如果裝飾的函數使用任何位置參數,則使用內省會導致錯誤。這樣可以防止使用的某些函數的位置參數,同時允許您根據需要定義這些函數。

作爲一個例子:

def kwargs_only(f): 
    def new_f(**kwargs): 
     return f(**kwargs) 
    return new_f 

要使用它:

@kwargs_only 
def abc(a, b, c): return a + b + c 

不能使用它從而(錯誤類型):

abc(1,2,3) 

可以使用它從而:

abc(a=1,b=2,c=3) 

更強大的解決方案將使用decorator模塊。

聲明:深夜答案不能保證!

相關問題