簡體   English   中英

嵌套的python try-except阻止不良代碼或代碼異味嗎?

[英]Are nested python try-except blocks bad code or code smell?

我遇到的情況是,我需要填充一個對象fillable_object,而我還有另一個對象fill_object用來填充第一個對象。 但是,filler_object可以是不具有相同屬性的不同類型。 在這種情況下,我希望與fillable_object中的字段相關的字段的值為null。

我想到的是,嘗試除塊之外,為每個可填充對象的類分組。 由於不同類的屬性集是互斥的,因此它們要么全部獲取要么不獲取,然后嘗試下一個類型,等等。當前fillable_object可以容納的類太多,但我認為這很煩人如果數量增加,以后再維護。

def fill_with(fillable, filler):
    try:
        fillable.attr1 = filler.attr1
    except AttrError:
        try:
            fillable.attr2 = filler.attr2
            fillable.attr3 = filler.attr3
        except AttrError:
            try:
                #Continue for each class filler can be.
            except AttrError:
return fillable

是的,這絕對是代碼的味道,您發現了原因:添加新的filler對象時會發生什么? 您必須重寫函數。 這違反了開閉原則

軟件實體(類,模塊,功能等)應打開以進行擴展,但應關閉以進行修改

具體來說,您可以使用一些解決方法,但是您處於典型的“大開關”中,可以/應該用明智的多態用法代替。

在您的示例中, filler觸發了異常:如果filler.attr1不存在,則嘗試下一個屬性,依此類推。 filler物具有的知識,因此,你應該把fill_with方法filler

class FillerA():
    ...

    def fill(self, fillable):
        fillable.attr1 = self.attr1

class FillerB():
    ...

    def fill(self, fillable):
        fillable.attr2 = self.attr2
        fillable.attr3 = self.attr3

...

現在您的功能就是:

def fill_with(fillable, filler):
    filler.fill(fillable)

該函數已關閉以進行修改,但是您可以通過添加新的filler類型(使用fill方法)來擴展它。 獎勵: filler不再需要公開他的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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