我怎样才能将这两个函数重构为更干?

时间:2011-03-16 14:32:08

标签: python

我有以下两个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循环的第一行外,这两个函数是相同的。不是很干。鉴于rowd属于不同类型(dict和我的自定义类型),我如何重构此代码以取消所有重复?

4 个答案:

答案 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 __方法以使其行为类似于字典。否则,使用知道表名的代理对象包装它。