AttributeError: 使用dateutil时'str'对象没有'n'属性
我正在使用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)
我就没有问题了。那可能出什么问题呢?
2 个回答
1
"rrule." + str(x.play_days) 这个表达式返回的是一个字符串,而不是一个变量名。你在硬编码的例子中传递的是一组变量。
你可能想要这样做:
playdays = [getattr(rrule, pd) for pd in x.play_days]
然后把 playdays 传给 byweekday 时,不要加上括号,像这样 byweekday=playdays,……正如 eumiro 在他的回答中提到的,这样做其实不是必须的 :)
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,)
如果你想从单个元素定义一个元组,记得加上逗号:
byweekday = (playdays,)