问题描述
|
我有以下函数,用于计算给定年份每月制造的小部件总数:
def get_monthly_totals(year):
queryset = Widget.objects.filter(manufactured__year=year)
totals = [0] * 12
for widget in queryset:
totals[widget.manufactured.month -1] += 1
return totals
首先,它获取给定年份的所有小部件对象,然后统计每个月的总数。
现在,小部件对象还具有sold属性(也是datetime类型)。我想将一个参数传递给上面的函数,以告诉它计算出售的每月总数或制造的每月总数。我可以编写另一个功能相同的函数,然后用sold替换制造的函数,但这似乎违背了DRY原则。这样做的最pythonic方法是什么?
解决方法
一种选择是使用
getattr()
:
def get_monthly_totals(year,attr):
queryset = Widget.objects.filter(**{attr + \"__year\": year})
totals = [0] * 12
for widget in queryset:
totals[getattr(widget,attr).month -1] += 1
return totals
totals_manufactured = gtotalset_monthly_totals(year,\"manufactured\")
totals_sold = get_monthly_totals(year,\"sold\")