如何减少if和else的重复使用

时间:2015-07-15 07:38:32

标签: python

我如何使用装饰器或其他优雅的方法来避免我的函数中出现大量if else逻辑

class DataModification():
    @classmethod
    def schedule(cls, df):
        if df.empty:
            return df
        else:
            df.rename(columns={'_id':'release_id'}, inplace=True)
            df.set_index("release_id", drop=True, inplace=True)
            df.rename(columns={'is_projection':'projections_available'}, inplace=True)
            df.rename(columns={'is_statement':'statement_available'}, inplace=True)
            return df.sort_index()

    @classmethod
    def function_b(cls, df):
        if df.empty:
            return df
        else:
            df.rename(columns={'_id':'release_id'}, inplace=True)
            df.set_index("release_id", drop=True, inplace=True)
            return df.sort_index()   

1 个答案:

答案 0 :(得分:2)

这两种方法都可以重写为:

@classmethod
def function_b(cls, df):
    if df.empty:
        return df
    df.rename(columns={'_id':'release_id'}, inplace=True)
    df.set_index("release_id", drop=True, inplace=True)
    return df.sort_index()

由于else条件为if,因此第一次返回时会确保True块中的代码无法运行。

这只是你在Python代码中到处看到的两行 - 所以我认为不需要装饰器。它只会增加复杂性,并为每个函数提供一行代码。如果你在计算行数,你也可以写:

if df.empty: return df

在我看来,它的可读性有点差。

尝试将装饰器编写为练习。我认为它应该像这样工作:

class Foo:
    @return_empty
    def bar(self, df):
        print "Not empty: %s" % df

class Test(set):
    @property
    def empty(self):
        return len(self) == 0

>>> f = Foo()    
>>> t = Test()   
>>> f.bar(t)
set()
>>> t.add(1)
>>> f.bar(t)
Not empty: Test([1])

<强>扰流

  

def return_empty(f): def _wrapper(self, df): if df.empty: return df return f(self, df) return _wrapper