[英]Python: store expected Exceptions in function attributes
將函數的預期異常存儲為函數本身的屬性是否為pythonic? 或只是一個惡心的壞習慣。
像這樣
class MyCoolError(Exception):
pass
def function(*args):
"""
:raises: MyCoolError
"""
# do something here
if some_condition:
raise MyCoolError
function.MyCoolError = MyCoolError
還有其他模塊
try:
function(...)
except function.MyCoolError:
#...
Pro:在我對函數的引用中,也對它可能引發的異常的引用,也不必顯式導入。
缺點:我“有”重復異常的名稱以將其綁定到函數。 這可以用裝飾器來完成,但這也增加了復雜性。
我之所以這樣做,是因為我以不規則的方式將某些方法附加到某些類上,在這些類中,我認為不值得使用mixin。 我們稱其為“量身定制的功能”。 例如,讓我們說:
Class A
使用方法fn1
和fn2
Class B
使用方法fn2
和fn3
Class C
使用fn4
... 因此,當我調用obj_a.fn2()
,我必須顯式導入它可能引發的異常(它不在類A,B或C所在的模塊中,而是在共享方法所在的另一類中)...我認為這有點煩人。 Appart從此開始,我正在努力的項目中的標准樣式迫使每行編寫一個導入,因此它變得非常冗長。
在某些代碼中,我看到了異常存儲為類屬性,並且發現它非常有用,例如:
try:
obj.fn()
except obj.MyCoolError:
....
我認為這不是Pythonic。 我還認為,與僅將異常與函數一起導入的標准方法相比,它沒有提供太多優勢。
有一個原因(除了幫助解釋器外),為什么Python程序使用import
語句來說明其代碼的來源; 它有助於查找正在使用的設施的代碼(例如,本例中的異常)。
整個想法都有異常聲明的味道,因為在C ++中是可能的,而在Java中則是部分強制的。 語言律師之間一直在討論這是一個好主意還是一個壞主意,在Python世界中,設計人員決定反對它,因此這不是Pythonic。
它還提出了很多其他問題。 如果您的函數A使用另一個函數B,然后又對其進行了更改以使其可以引發異常(在Python中是有效的東西),將會發生什么。 您是否願意先更改函數A使其反映(或在A中捕獲)? 您想在哪里畫線—使用int(text)
將字符串轉換為int的原因足以“聲明”可以拋出ValueError
?
總而言之,我認為這不是Pythonic,不是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.