簡體   English   中英

Python:將預期的異常存儲在函數屬性中

[英]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使用方法fn1fn2
  • Class B使用方法fn2fn3
  • Class C使用fn4 ...
  • 像這樣大約15個班級。

因此,當我調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM