AttributeError: 使用dateutil时'str'对象没有'n'属性

2 投票
2 回答
3655 浏览
提问于 2025-04-17 12:40

我正在使用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,)

撰写回答