嵌套的python try-except阻止不良代码或代码异味吗?

时间:2018-11-23 14:30:49

标签: python functional-programming

我遇到的情况是,我需要填充一个对象fillable_object,而我还有另一个对象fill_object用来填充第一个对象。但是,filler_object可以是不具有相同属性的不同类型。在这种情况下,我希望与fillable_object中的字段相关的字段的值为null。

我想到的是在尝试try块之外为fillable_object可以包含的每个类分组。由于不同类的属性集是互斥的,因此它们要么全部获取要么不获取,然后尝试下一个类型,等等。当前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

1 个答案:

答案 0 :(得分:0)

是的,这绝对是代码的味道,您发现了原因:添加新的filler对象时会发生什么?您必须重写函数。这违反了Open-closed principle

  

软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改

具体地,您可以使用一些解决方法,但是您处于典型的“大开关”中,可以/应该用明智地使用多态来代替。

在您的示例中,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不再需要公开其属性。