【问题标题】:AttributeError: 'str' object has no attribute 'n' when using dateutilAttributeError: 'str' 对象在使用 dateutil 时没有属性 'n'
【发布时间】:2012-03-01 21:06:45
【问题描述】:

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

我没问题。可能出了什么问题。

【问题讨论】:

    标签: python python-dateutil


    【解决方案1】:
    (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,)
    

    【讨论】:

      【解决方案2】:

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

      您可能想要这样做:

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

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

      【讨论】:

      • 谢谢,让我试试这个,或许能帮我解决问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 2021-10-04
      • 2019-12-02
      • 2021-09-25
      • 2014-03-04
      • 2013-09-22
      相关资源
      最近更新 更多