不同对象属性的每月总计函数

问题描述

| 我有以下函数,用于计算给定年份每月制造的小部件总数:
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\")