假設在python中你有一個接受三個命名參數(如**參數)的例程,但是這三個參數中的任意兩個都必須填入。如果只填充了一個參數,那就是錯誤。如果三者都是,那就錯了。你會提出什麼樣的錯誤? RuntimeError,一個特別創建的異常或其他?如果將錯誤的參數傳遞給** args,會引發什麼異常?
10
A
回答
13
請記住,您可以繼承Python的內置異常類(並且TypeError
肯定會是在此引發的正確的內置異常類 - 這就是Python在正常情況下參數個數不匹配時引發的內容在簽名中沒有*a
或**k
表格的情況)。我喜歡有每個包定義自己class Error(Exception)
,然後具體的例外根據需要可以繁殖繼承適當的,例如:
class WrongNumberOfArguments(thispackage.Error, TypeError):
然後,我會raise WrongNumberOfArguments
時,我發現這樣的問題的情況。
這樣,任何一個來電者是誰知道這個包可以趕上thispackage.Error
,如果他們需要處理特定的軟件包的任何錯誤,而其他主叫方呼叫(調用鏈大概得更高)仍趕上更通用TypeError
以處理任何錯誤,例如「函數調用中使用的參數數量錯誤」。
3
我會做一個具體的。你可以捕捉它,並處理特定的異常,因爲它是你創建的一個特殊情況:)
4
如果(如你在其中一條評論中所說)這是一個程序員錯誤,那麼你可以引發AssertionError:
def two(**kwargs):
assert len(kwargs) == 2, "Please only provide two args"
順便說一句,如果你只有三個命名參數,** kwargs似乎是一個奇怪的方式來做到這一點。更自然的可能是:
def two(a=None, b=None, c=None):
pass
0
我會用一個ValueError,或者其子類:當一個內置操作或者函數接收具有正確的類型,但不恰當的值的參數,而且情況是「募集沒有被更精確的異常所描述,如IndexError。「
如果您將所有參數視爲單個元組,則在需要精確爲2時傳遞3或1的值在技術上將是不適當的值......至少在我看來! :)
11
爲什麼不只是做什麼python呢?
>>> abs(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (3 given)
0
我推薦一個自定義異常。像這樣:
class NeedExactlyTwo(ValueError):
pass
然後你可以在你的代碼中raise NeedExactlyTwo
。
請務必在文檔字符串中爲您的函數記錄此信息。
相關問題
- 1. 如果您將int傳遞給C中的字節參數,會發生什麼?
- 2. 爲什麼直接將Promise.all傳遞給.then函數會引發錯誤?
- 3. 如果通過REST調用傳遞錯誤的參數會引發錯誤?
- 4. 將參數傳遞給Import-Csv時Powershell引發錯誤
- 5. 如果我的IExceptionPublisher引發異常,會發生什麼情況?
- 6. 將nil作爲參數傳遞給stringWithString時發生異常:?
- 7. 爲什麼argparse不會引發異常?
- 8. TeamCity將什麼參數傳遞給MSBuild?
- 9. 錯誤參數傳遞給.ksh
- 10. Variadic args。如何可變參數ARGS傳遞給
- 11. 如果finally塊引發異常,會發生什麼情況?
- 12. 如果CFile :: Write引發異常會發生什麼情況?
- 13. 爲什麼將char *傳遞給字符串參數會產生編譯錯誤?
- 14. 應該將什麼參數傳遞給異步函數
- 15. 爲什麼我在將DateTime參數傳遞給我的存儲過程時引發了SQL異常?
- 16. 爲什麼使用* args和** kwargs會在wxpython中引發錯誤?
- 17. 爲什麼Hotspot會引發pulseaudio異常?
- 18. 將參數傳遞給bash函數會導致錯誤
- 19. Scala:將Seq傳遞給var-args函數
- 20. Python 3:將函數傳遞給* args
- 21. 如果您將匿名對象傳遞給需要引用的函數,那麼在C++中會發生什麼?
- 22. 如果第一個參數不是類,issubclass會引發異常
- 23. 如何使用aasm將傳遞給事件的參數傳遞給錯誤塊?
- 24. 爲什麼findViewById()會引發空異常? ?
- 25. 將參數傳遞給函數引用?
- 26. 爲什麼'被刪除的實體傳遞給persist'異常被引發?
- 27. 傳遞給org.jboss.resteasy.spi.metadata.ResourceMethod的錯誤參數
- 28. 數量的參數錯誤傳遞
- 29. 將函數中的數組傳遞給scanf時發生異常
- 30. 爲什麼在PHP中不會引發異常?
這是很好地使用多重繼承的一個很好的例子。謝謝。 –