我有以下两个Python函数:
@classmethod
def serialize_dict(cls, d):
values = []
for column_name in cls().distinguishing_column_names():
value = str(d[column_name])
if value == 'None':
value = ''
values.append(value)
return ' '.join(values)
@classmethod
def serialize_row(cls, row):
values = []
for column_name in cls().distinguishing_column_names():
value = str(row.value(cls()._meta.db_table, column_name))
if value == 'None':
value = ''
values.append(value)
return ' '.join(values)
如您所见,除for
循环的第一行外,这两个函数是相同的。不是很干。鉴于row
和d
属于不同类型(dict
和我的自定义类型),我如何重构此代码以取消所有重复?
答案 0 :(得分:4)
为什么不在自定义类型中实现dict
接口的相关位?
这样row[column_name]
会产生您想要的代码吗?
您可以使用__getitem__
特殊方法。
答案 1 :(得分:3)
添加if isinstance(arg, dict)
以确定是将其视为行还是dict,然后将这两种方法合并在一起。
答案 2 :(得分:3)
您可以实现将该位序列化为两个不同的lambda函数的函数,然后可以将这些函数用作单个序列化方法的参数:
ds = lambda d , cls , column_name : str(d[column_name])
rs = lambda d , cls , column_name : str(d.value(cls()._meta.db_table, column_name))
def __serialize(cls, d, ser):
values = []
for column_name in cls().distinguishing_column_names():
value = ser(d,cls,column_name)
if value == 'None':
value = ''
values.append(value)
return ' '.join(values)
@classmethod
def serialize_dict(cls, d):
return __serialize(cls, d, ds)
@classmethod
def serialize_row(cls, row):
return __serialize(cls, d, rs)
答案 3 :(得分:2)
如果行实例可以获取其表的名称,请添加__ getitem __方法以使其行为类似于字典。否则,使用知道表名的代理对象包装它。