在下面的代码中,所有函数对都非常相似:
rankListId不同rankListName不同Mongoengine是不同的rankListId是不同的我怎样才能把这些函数变成一个函数呢?
def set_male_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_male_rank_list"
rankList.rankListName = u"十大男生比例最高职业"
rankList.itemList = []
charts = ZhinengMaleCharts.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_male_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_male_rank_list")
def set_female_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_female_rank_list"
rankList.rankListName = u"十大女生比例最高职业"
rankList.itemList = []
charts = ZhinengFemaleCharts.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_female_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_female_rank_list")
def set_salary0_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_salary0_rank_list"
rankList.rankListName = u"十大毕业生高薪职业"
rankList.itemList = []
charts = ZhinengSalary0Charts.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_salary0_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_salary0_rank_list")
def set_salary5_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_salary5_rank_list"
rankList.rankListName = u"十大五年后高薪职业"
rankList.itemList = []
charts = ZhinengSalary5Charts.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_salary5_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_salary5_rank_list")
def set_salary5_inc_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_salary5_inc_rank_list"
rankList.rankListName = u"十大五年涨幅最大职业"
rankList.itemList = []
charts = ZhinengSalary5IncCharts.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_salary5_inc_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_salary5_inc_rank_list")
def set_salary5_inc_ratio_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_salary5_inc_ratio_rank_list"
rankList.rankListName = u"十大五年涨幅比例最大职业"
rankList.itemList = []
charts = ZhinengSalary5IncRatioCharts.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_salary5_inc_ratio_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_salary5_inc_ratio_rank_list")
def set_stability_asc_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_stability_asc_rank_list"
rankList.rankListName = u"十大最不稳定职业"
rankList.itemList = []
charts = ZhinengYearsDesc.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_stability_asc_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_stability_asc_rank_list")
def set_stability_desc_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_stability_desc_rank_list"
rankList.rankListName = u"十大最稳定职业"
rankList.itemList = []
charts = ZhinengYearsAsc.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_stability_desc_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_stability_desc_rank_list")
def set_major_ratio_asc_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_major_ratio_asc_rank_list"
rankList.rankListName = u"十大就页面最窄职业"
rankList.itemList = []
charts = ZhinengMajorsAsc.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_major_ratio_asc_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_major_ratio_asc_rank_list")
def set_major_ratio_desc_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_major_ratio_desc_rank_list"
rankList.rankListName = u"十大就页面最广职业"
rankList.itemList = []
charts = ZhinengMajorsDesc.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_major_ratio_desc_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_major_ratio_desc_rank_list")
def set_male_priority_rank_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_male_priority_rank_list"
rankList.rankListName = u"十大男性有优势专业"
rankList.itemList = []
charts = ZhinengMaleMinusFemaleCharts.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_male_priority_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_male_priority_rank_list")
def set_female_priority_list(self):
rankList = RankList()
rankList.rankListId = "zhineng_male_priority_rank_list"
rankList.rankListName = u"十大女性有优势专业"
rankList.itemList = []
charts = ZhinengFemaleMinusMaleCharts.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
def get_female_priority_rank_list(self):
return self.rankListClient.getRankList("", "zhineng_female_priority_rank_list")发布于 2015-05-20 22:39:13
我认为这里有更多的问题,而不仅仅是你所粘贴的这些方法。我将首先在这里讨论总体想法,然后讨论您可以在不更改接口的情况下进行更改。
这里有几种方法,每种方法在参数化方面都不同,而不是它们的实际行为。这是一个巨大的危险信号,应该立即处理。
现在你怎么做是另一回事了。下面,我将将其重构为一种更实用的方法,并假设由于外部代码不受您的控制,接口无法更改。
然而,我也想在这里提出另一个想法,它可能,也可能不适用于你。
由于(不可见的)容器类有太多的方法,看起来不太好,名称在各处重复,最终结果是可怕的名称。不如使用两个方法来公开包装器对象,而不是有几个get/set_*_rank_list方法。因此,例如。
class Foo(object):
def __init__(self, ...):
...
self.male_rank_list = RankListWrapper(
"zhineng_male_rank_list",
u"十大男生比例最高职业",
ZhinengMaleCharts,
self.rank_list_client
)
...然后,访问模式将类似于:
foo.male_rank_list.fetch() # instead of foo.get_male_rank_list()
foo.male_rank_list.update() # instead of foo.set_male_rank_list()不是最好的方法名称,但仍然比get/set更好。
您在这里得到的是更多的灵活性和大量的打字减少。当然,这也可以通过更多的元编程来实现,但对我可以从您的代码中收集到的内容,以及您的需求来说,这已经足够了。
RankLists不使用构造函数初始化?如果您不能更改它,那么您可以创建一个像create_rank_list这样的包装器函数来解决这个问题。for c in charts循环是冗长的,同样的事情可以更容易地通过列表理解来实现: rankList.itemList = RankListItem(c.zhineng )_id,c.zhineng_图中c的id)这里奇怪的是RankListItem接受了两次ID参数。如果可能的话,将其更改为默认为第一个参数。否则,您可以创建像create_rank_list_item(id)这样的辅助函数。此时,您可以选择函数式路线,也可以采用更多数据驱动的路线--我选择后者是为了更密切地模仿上面描述的想法。通过将函数的所有参数放入单独的定义(不管是类、字典、纯文本或命名元组),代码变得更短、更可重用。
最终结果如下所示:
def create_rank_list(id, name, item_list):
result = RankList()
result.rankListId = id
result.rankListName = name
result.itemList = item_list
return result
def create_rank_list_item(id):
return RankListItem(id, id)
class RankListDefinition(object):
def __init__(self, id, name, charts):
self.id = id
self.name = name
self.charts = charts
MALE_RANK_LIST = RankListDefinition(
"zhineng_male_rank_list",
u"十大男生比例最高职业",
ZhinengMaleCharts
)
...
class Foo(object):
...
def set_rank_list(self, definition):
charts = definition.charts.objects.all()[:10]
rank_list = create_rank_list(
definition.id,
definition.name,
[create_rank_list_item(c.zhineng_id) for c in charts]
)
self.rankListClient.setRankList("", rank_list)
return rank_list
def get_rank_list(self, definition):
return self.rankListClient.getRankList("", definition.id)
def set_male_rank_list(self):
return self.set_rank_list(MALE_RANK_LIST)
def get_male_rank_list(self):
return self.get_rank_list(MALE_RANK_LIST)
...如您所见,所有内容都被分解到代码(get/set_rank_list)和数据(MALE_RANK_LIST,.)中,因此,通过再添加一个定义(以及这个变体中的两个方法),就可以添加一个新的列表了。
由于包装方法非常无用,我仍然建议改用上述间接方法。
另外,如果所有这些方法都被一个接一个地调用,我也会删除所有这些方法,以支持在一个“排名列表定义”列表上的循环(只是说)。
发布于 2015-05-20 15:33:17
我在Python上有点生疏,所以我的语法可能有点错误,但是这样的东西应该能用.
方法的目的是避免冗余。上述两个函数的逻辑完全相同,只有几个小例外,那么为什么不为它们使用ifs和字符串操作呢?
def set_rank_list(self, gender):
rankList = RankList()
rankList.itemList = []
rankList.rankListId = "zhineng_%s_rank_list" % gender
rankList.rankListName = u"十大男生比例最高职业"
if gender is 'male':
charts = ZhinengMaleCharts.objects.all()[:10]
else:
charts = ZhinengFemaleCharts.objects.all()[:10]
for c in charts:
rankList.itemList.append(RankListItem(c.zhineng_id, c.zhineng_id))
self.rankListClient.setRankList("", rankList)
return rankList
# and you can add these for convenience
def set_female_rank_list(self):
return self.set_rank_list('female')
def set_male_rank_list(self):
return self.set_rank_list('male')发布于 2015-05-20 20:19:16
只是扩展了陈氏解
rankList = RankList()
rankList.rankListId ="zhineng_male_rank_list"
rankList.rankListName = u"十大男生比例最高职业"
rankList.itemList = []
# makes it easier sex is later decided to be presented as 'M'/'F'
@classmethod
def is_male(gender)
return {
'male': True,
'female': False,
}.get(x, False) # can be replaced by None for a wrong gender
self.chartSize = 10
def set_rank_list(self,gender):
charts = ZhinengMaleCharts if is_male(gender) else ZhinengFemaleCharts
charts = charts[0:self.chartSize]
rankList.itemList = [RankListItem(c.zhineng_id, c.zhineng_id) for c in charts]
self.rankListClient.setRankList("", rankList)
return rankList如对下列更改有任何意见,敬请见谅。
https://codereview.stackexchange.com/questions/91294
复制相似问题