【问题标题】:TypeError: 'datetime.datetime' object is not callableTypeError:'datetime.datetime' 对象不可调用
【发布时间】:2014-08-12 22:26:17
【问题描述】:

我有一些 Python 代码会遍历两个开始日期之间的所有日子。开始日期始终为 11 月 1 日,结束日期始终为 5 月 31 日。但是,代码会迭代多年。我的代码是这样的:

import time
from datetime import datetime
from datetime import date, timedelta as td

list1 = [2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013]
list2 = [2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014]


for x, y in zip(list1, list2):
    print "list1 - " + str(x)
    print "list2 - " + str(y)


    d1 = date(x,11,01)
    d2 = date(y,5,31)

    delta = d2 - d1



    for i in range(delta.days + 1):

        time1 =  str(d1 + td(days=i))
        time2 = time1.split("-", 1)[0]
        time3 = time1.split("-", -1)[1]
        time4 = time1.rsplit("-", 1)[-1]

        time2 = int(time2)
        time3 = int(time3)
        time4 = int(time4)

        date = datetime(year=time2, month=time3, day=time4)

...some processing here...

在第一个周期完成之前,此代码可以正常工作。然后它会在日志中打印下两个值 'list1' 和 'list2' 作为 2001 和 2002,然后产生以下错误:

Traceback (most recent call last):
  File "C:\Python27\newtets\newtets\spiders\test3.py", line 17, in <module>
    d1 = date(x,11,01)
TypeError: 'datetime.datetime' object is not callable

在第二次通过时,它似乎没有解决分配给变量“x”的年份。谁能告诉我这是为什么?

谢谢

【问题讨论】:

    标签: python time


    【解决方案1】:

    这是因为您有一个名为 date 的变量正在遮蔽导入的 datetime.date。使用不同的变量名。

    演示:

    >>> from datetime import date, datetime
    >>> date(01,11,01)
    datetime.date(1, 11, 1)
    >>> date = datetime(year=2014, month=1, day=2)
    >>> date(01,11,01)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'datetime.datetime' object is not callable
    

    【讨论】:

      【解决方案2】:

      我认为以下行:

      date = datetime(year=time2, month=time3, day=time4)
      

      是问题所在。在这里,您正在重新定义 date 以具有与日期类(可能是)不同的值(不能被调用)。

      在“第二次通过”时,它会:

      d1 = date(x,11,01)
      

      date 不是它以前的样子(它不能被调用),所以你得到了错误。

      也许将变量名称更改为其他名称,例如dte?

      【讨论】:

      • 这是具有误导性的术语。你当然可以调用一个变量; d = datetime.strptime; d('2014', '%Y')。就此而言,date已经是一个变量,只是它曾经命名date 类,它是可调用的,现在它命名一个datetime 实例,它不是。如果您的意思是“对象”或“实例”或类似的东西,那也行不通;任何类都可以定义__call__ 方法,而函数和类是完全执行此操作的类的实例(由语言定义,而不是您的代码,但除此之外没有什么不同)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多