即使使用 "import datetime",类型对象 'datetime.datetime' 没有属性 'datetime'。

3
我在使用AppEngine时,遇到了“type object 'datetime.datetime' has no attribute 'datetime'”的错误提示,这是关于datetime类型的问题,但是我已经导入了“import datetime”。其它文件中有“from datetime import datetime”的引用,但我认为这不应该影响到这个文件。
我检查过代码,没有“意外”的重新导入。我查看了AppEngine日志,发现这个问题仅发生在两天前。
我的运行环境是2.7版。
编辑:这是导致错误的代码行(请注意,我使用的是“import datetime”,而不是“from datetime import datetime”)。
task.due_at = datetime.datetime.strptime(date, '%Y-%m-%d %I:%M%p')

编辑:堆栈跟踪

type object 'datetime.datetime' has no attribute 'datetime'
Traceback (most recent call last):
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~wmphighrise/1.373696587983821954/myapp/handler/decorators.py", line 22, in wrapper
    return fn(*args, **kwargs)
  File "/base/data/home/apps/s~wmphighrise/1.373696587983821954/myapp/handler/api/main.py", line 1343, in post
    task.due_at = datetime.datetime.strptime(date, '%Y-%m-%d %I:%M%p')
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'

编辑3:一些调试

注意:import datetime在顶部

#1st attempt
import datetime
class MyHandler():
  def get(self):
    logging.info(datetime) # => "<type 'datetime.datetime'>"

#2nd attempt
import datetime
class MyHandler():
  def get(self):
    import datetime  # explicitly re-import the module
    logging.info(datetime) # => "<module 'datetime' (built-in)>"

#3rd attempt
import datetime
class MyHandler():
  def get(self):
    logging.info(datetime) # => Throws UnboundLocalError: local variable 'datetime' referenced before assignment
                           # Is this normal? This is new to me.
    import datetime
    logging.info(datetime)

#4th attempt
import datetime
logging.info(datetime) # => "<module 'datetime' (built-in)>"
class MyHandler():
  def get(self):
    logging.info(datetime) # => "<type 'datetime.datetime'>"

有没有一种方法可以在当前文件或模块之外重新定义变量?因为我已经仔细查看了这个文件,没有重新定义变量。
编辑4:
我已经使用了ack命令查找了"datetime ="、"datetime="、"datetime.datetime ="和"datetime.datetime=",但是没有结果表明有重新赋值。我检查了过去两天的git日志,也没有可能引入它的更改。

2
没有 datetime.datetime.datetime。你在你的梦境中深入了一层。 - mhlester
1
是的,我知道。我已经导入了datetime模块。它应该有一个datetime.datetime类型的类。 - john2x
错误提示说“datetime.datetime”没有“datetime”,因为它确实没有。你只需要使用“datetime.datetime”。 - Jayanth Koushik
你的修改都在一个模块里吗?还是不同的版本? - mhlester
好的,你遇到了一些奇怪的问题,我们需要看真正的代码。特别是第三次尝试在正常的Python代码中是不可能实现的,第四次尝试也不可能做到那样。 - Tim Hoffman
显示剩余3条评论
4个回答

6
您所提供的代码对我而言可行,因此问题很可能在于您将名为 datetimedatetime.datetime 对象影响了 datetime 模块。不要误会,我是认真的,我是有意这么写的。
>>> import datetime
>>> datetime = datetime.datetime.now()  # waves goodbye to datetime module!
>>> task.due_at = datetime.datetime.strptime(date, '%Y-%m-%d %I:%M%p')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'datetime.datetime' object has no attribute 'datetime'

我希望是这样的。我已经检查了我的代码,没有重新分配“datetime”。 - john2x
1
你能在相关代码行之前“打印日期时间(datetime)”吗? - mhlester
是的,导入“datetime”的所有内容都在访问同一个模块。理论上,您可以从不同的模块中进行调用“datetime.datetime = datetime.datetime.now()”。 - mhlester
抱歉,刚刚意识到如果我不包括 @john2x,你将不会收到评论通知。 - mhlester
好的,我已经确认了“datetime =”、“datetime =”、“datetime.datetime =”和“datetime.datetime =”,但没有重新分配结果。我检查了过去2天的git日志,没有任何可能引入它的更改。(这只发生在两天前) - john2x
显示剩余3条评论

1

如果我理解你的意思正确的话,你在问以下代码片段中的 UnboundLocalError 错误。我是对的吗?

#3rd attempt
import datetime
class MyHandler():
    def get(self):
        logging.info(datetime) # => Throws UnboundLocalError: local variable 'datetime' referenced before assignment
                           # Is this normal? This is new to me.
        import datetime
        logging.info(datetime)

如果是这样,错误就很明显了。你需要理解两件事情:
  1. 所有命名空间的更改(赋值、删除、导入、定义、类)都发生在本地作用域中(即在执行更改命名空间代码的当前作用域中)。

  2. import X 导入模块 X,并在当前命名空间中创建对该模块的引用。也就是说,import 会更改命名空间。

虽然在函数get中调用 import datetime 前后名称 datetime 都指向相同的对象(模块 datetime),但这两个datetime 处于不同的作用域(第一个为全局作用域,第二个为局部作用域)。

一旦 Python 检测到本地作用域中存在一个名称(在您的情况下为 "datetime"),如果在本地名称绑定之前使用该名称,它将引发错误。

>>> import datetime
>>> def get():
        print(dir())

>>> get()
[]
>>> def get():
        import datetime
        print(dir())

>>> get()
['datetime']
>>> 

希望它有所帮助。

0

我总是会对说出 datetime.datetime 这个词感到好笑,但你更进一步地向 Python 请求了它的属性 datetimedatetime.datetime。 :D

当然,Python 没有一个 datetime.datetime.datetime


0

我想将自定义日期转换为datetime,这个方法对我很有用:

end_date = '2025-12-31'
end_date = datetime(2025, 12, 31)
end_date= end_date.date()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接