嵌套的python tryexcept块是坏代码还是代码气味?

2024-10-06 11:22:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个情况,我得到一个对象,我需要填充的可填充对象,还有另一个对象,填充对象,我用来填充第一个对象。但是,filler\u对象可以是不同类型的,但属性不同。在这种情况下,我希望与fillable\u对象中的字段相关的字段得到null值。你知道吗

我想到的是在try except块中为每个可填充的\u对象可以是的类分组。由于不同类的属性集是互斥的,它要么获取所有的属性集,要么获取非属性集,然后尝试下一个类型等。目前filleble\u 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

Tags: 对象类型属性情况nullfillertryexcept
1条回答
网友
1楼 · 发布于 2024-10-06 11:22:34

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

software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification

具体地说,您可以使用一些变通方法,但是您正处于一个典型的“大切换”中,可以/应该被多态性的明智使用所取代。你知道吗

在您的示例中,触发异常的是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不再需要暴露他的属性。你知道吗

相关问题 更多 >