2

我正在使用 dateutil rrule 函数.. 我从 django 的数据模型中获取工作日。当我像这样把它放在 rrule 函数中时

for x in lgs:
    teams = Team.objects.filter(league=x.id)
    teamcount = len(teams)
    playdays = "rrule." + str(x.play_days)
    fixdays = rrule.rrule(rrule.DAILY,byweekday = (playdays),dtstart=startdate,until=endate)
    print list(fixdays)

Traceback (most recent call last):
File "<console>", line 5, in <module>
File "/usr/lib/pymodules/python2.7/dateutil/rrule.py", line 345, in __init__
    elif not wday.n or freq > MONTHLY:
AttributeError: 'str' object has no attribute 'n'

如果我正常使用该功能,并将第 5 行替换为

    fixdays = rrule.rrule(rrule.DAILY,byweekday = (rrule.SU, rrule.MO),dtstart=startdate,until=endate)

我没问题。有什么问题。

4

2 回答 2

2
(rrule.SU, rrule.MO)

dateutil.rrule.weekday对象的列表(元组),而

"rrule." + str(x.play_days)

是一个字符串(没有.n属性)。

你可以定义一个字典:

weekday = {'MO': rrule.MO, 'TU': rrule.TU, … }

然后调用它:

playdays = weekday[str(x.play_days)]

另外,请记住

byweekday = (playdays)

是相同的

byweekday = playdays

如果要从单个元素定义元组,请添加逗号:

byweekday = (playdays,)
于 2012-02-09T11:36:10.983 回答
1

“规则。” + str(x.play_days) 返回一个字符串而不是具有该名称的变量,而在您的硬编码示例中,您正在传递一组变量

你可能想做这样的事情:

playdays = [getattr(rrule, pd) for pd in x.play_days]

然后将 playdays 传递给不带括号的 byweekday,例如 byweekday=playdays, ..... 正如 eumiro 在他的回答中所说,没有必要:)

于 2012-02-09T11:42:48.987 回答