我如何使用装饰器或其他优雅的方法来避免我的函数中出现大量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()
答案 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