爲了避免出現明顯的錯誤,我想阻止使用帶有某些函數的位置參數。有什麼辦法可以實現嗎?python:是否有可能要求函數的參數都是關鍵字?
3
A
回答
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
模塊。
聲明:深夜答案不能保證!
相關問題
- 1. Python argparse的參數是python關鍵字
- 2. Python命名的參數是關鍵字?
- 3. 是否有可能繞過C#函數參數強打字?
- 4. 可以PHP函數有關鍵字參數? (如Python)
- 5. 在函數參數中使用auto關鍵字是否正確?
- 6. 你能否要求函數參數是函數類的靜態常量?
- 7. 是否有可能有匿名函數的參數?
- 8. 是否有可能在t-sql中沒有參數的函數?
- 9. 是否有可能解決異步函數沒有return關鍵字
- 10. Python中是否有函數作爲主要參數C
- 11. 是否有可能使用高階函數與可選參數
- 12. 是否有可能在Python中獲取關鍵字列表?
- 13. Python的關鍵字參數
- 14. 可能宏參數的名稱是關鍵字嗎?
- 15. Spring是否要求所有的bean都有默認的構造函數?
- 16. 是否有可能擁有帶參數的Python類裝飾器?
- 17. 是否有可能在XML中傳遞構造函數參數?
- 18. 是否有可能將函數作爲參數傳遞給c?
- 19. 是否需要驗證函數參數?
- 20. 是否可以使用查詢參數填充IN關鍵字
- 21. 是否所有MapReduce實現都將鍵參數輸入到reduce函數中?
- 22. 是否有可能從參數
- 23. 是否有可能在運行時用參數生成一個Python函數?
- 24. python是否有「causes_exception()」函數?
- 25. Django TypeError:'bar'是這個函數的無效關鍵字參數
- 26. Django:「state」是此函數的無效關鍵字參數
- 27. 'x'是這個函數的無效關鍵字參數
- 28. Django:TypeError:'username'是此函數的無效關鍵字參數
- 29. TypeError:'ndim'是此函數的無效關鍵字參數
- 30. 是否有可能將「關鍵字」也視爲「非關鍵字」的語法?
爲什麼這樣做?我們都在這裏同意大人,對吧? – ktdrv
答案其實很簡單:不。我知道,你可能會認爲有一個很棒的用例可以解決一些出色的問題,但相信我,你們正在反對語言的基本哲學 - 我們都贊同成年人。這隻會導致悲傷去追求這樣一個過程。 – cwallenpoole
這聽起來像是一個愚蠢的事情_enforce_。然而,如果你喜歡,你可以養成在函數調用時通過名字指定位置參數的習慣。這樣,如果位置參數的名稱發生變化,調用者將得到一個TypeError(這是你試圖避免的那種明顯的錯誤?)。 – wim