Python 有没有办法重构这两个函数?德扬戈
我想我已经用了相当多的时间来呈现查询中的信息。我想知道是否有办法重构它们 这些代码的示例包括Python 有没有办法重构这两个函数?德扬戈,python,django,function,refactoring,reusability,Python,Django,Function,Refactoring,Reusability,我想我已经用了相当多的时间来呈现查询中的信息。我想知道是否有办法重构它们 这些代码的示例包括 def render_objA(self, objAs): output = [] for obj in objAs: output.append({ 'id': obj.id, 'name': obj.name 'description': obj.description,
def render_objA(self, objAs):
output = []
for obj in objAs:
output.append({
'id': obj.id,
'name': obj.name
'description': obj.description,
'createdAt': obj.created,
'modifiedAt': obj.modified
})
return output
def render_objB(self, objBs):
output = []
for obj in objBs:
output.append({
'id': obj.id,
'name': obj.name,
'content': obj.content,
'createdAt': obj.created,
'modifiedAt': obj.modified
})
return output
def render_objC(self, objCs):
output = []
for obj in objCs:
output.append({
'id': obj.id,
'first_name': obj.first_name,
'last_name': obj.last_name,
'full_name': obj.full_name,
'createdAt': obj.created,
'modifiedAt': obj.modified
})
return output
一些输出可能比其他输出有更多的字段,当然也有不同的字段名。这要看情况而定
唯一相似且肯定相同的字段是createdAt
和modifiedAt
有人能给我一个主意或者告诉我怎么做吗
提前感谢不确定这是好是坏,但您可以创建密钥映射。它可能会降低可读性,但会减少代码长度
key_mapping = {
'created': 'createdAt',
'modified': 'modifiedAt',
}
def create_dic(self, obj, key_list):
dic = {}
for k in key_list:
v = getattr(obj, k, None)
key = key_mapping.get(k, k)
if v is not None:
dic[key] = v
return dic
def render_objA(self, objAs):
key_list = ['id', 'name', 'description', 'created', 'modified']
return [create_dic(obj, key_list) for obj in objAs]
def render_objB(self, objBs):
key_list = ['id', 'name', 'content', 'created', 'modified']
return [create_dic(obj, key_list) for obj in objBs]
def render_objC(self, objCs):
key_list = ['id', 'name', 'first_name', 'last_name', 'full_name', 'created', 'modified']
return [create_dic(obj, key_list) for obj in objCs]
我不确定您是否正在尝试渲染对象的所有字段,但如果是,您可以这样做。将这段代码添加到模型中
def __iter__(self):
for field_name in self._meta.get_all_field_names():
value = getattr(self, field_name, None)
yield (field_name, value)
然后你的渲染方法就是这样
def render_obj(self, myobjs):
output = []
for obj in myobjs:
dict = {}
for field, val in obj:
dict[field] = val
output.append(dict)
return output
您应该在所有类上都有一个从对象创建dict的方法。然后,您可以在任何类型上使用您的方法。更不用说重构了。我的问题是这个代码首先应该做什么?它看起来很像。