python"import datetime"vs"from datetime import datetime"

cod*_*nob 37 python datetime attributeerror

我有一个脚本需要在脚本中的不同行执行以下操作:

today_date = datetime.date.today()
date_time = datetime.strp(date_time_string, '%Y-%m-%d %H:%M')
Run Code Online (Sandbox Code Playgroud)

在我的import语句中,我有以下内容:

from datetime import datetime
import datetime
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

AttributeError: 'module' object has no attribute 'strp'
Run Code Online (Sandbox Code Playgroud)

如果我将import语句的顺序更改为:

import datetime
from datetime import datetime
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

AttributeError: 'method_descriptor' object has no attribute 'today'
Run Code Online (Sandbox Code Playgroud)

如果我再次将import语句更改为:

import datetime
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

AttributeError: 'module' object has no attribute 'strp'
Run Code Online (Sandbox Code Playgroud)

这里发生了什么,如何让两者兼顾?欣赏它.谢谢.

kin*_*all 63

您的麻烦在于您有一些代码datetime需要作为对datetime 模块的引用以及期望datetime作为datetime 的引用的其他代码.显然,它不可能两者兼而有之.

当你这样做时:

from datetime import datetime
import datetime
Run Code Online (Sandbox Code Playgroud)

您首先设置datetime为对类的引用,然后立即将其设置为对模块的引用.当你以相反的方式做到这一点时,它是同样的事情,但它最终成为对类的引用.

您需要重命名其中一个引用.例如:

import datetime as dt
from datetime import datetime
Run Code Online (Sandbox Code Playgroud)

然后,您可以更改引用datetime.xxxx模块的表单中的引用dt.xxxx.

或者只是import datetime更改所有引用以使用模块名称.换句话说,如果只是说datetime(...)你需要改变那个引用datetime.datetime.

不幸的是,Python在它的库中有很多类似的东西.如果他们在PEP 8中遵循他们自己的命名准则,则datetime该类将被命名,Datetime并且使用它们datetime来表示模块并Datetime表示该类是没有问题的.

  • 重命名模块似乎不是一个好选择.使用`import datetime`或`from datetime import datetime`,而不是两者都使用. (2认同)
  • 我认为最好的方法是只做import datetime,然后在使用类的时候,做datetime.datetime。这样代码就清晰了,不容易出错。在所有代码中都携带 datetime.datetime 很烦人,但是为了 IMO 的清晰起见,这个库的糟糕命名没有留下任何选择。 (2认同)
  • 根据 PEP 8 的@kindall 建议,我建议以下“from datetime import datetime as DateTime, timedelta as TimeDelta, date as Date” (2认同)
  • @jfs,考虑到其他模块的广泛重命名,为什么重命名是一个糟糕的选择:`import pandas as pd`、`import numpy as np`等 (2认同)

Mar*_*ers 25

你不能同时使用这两个陈述; 该datetime 模块包含一个datetime 类型.datetime您自己模块中的本地名称只能引用其中一个.

使用import datetime,然后确保始终用于datetime.datetime引用包含的类型:

import datetime

today_date = datetime.date.today()
date_time = datetime.datetime.strptime(date_time_string, '%Y-%m-%d %H:%M')
Run Code Online (Sandbox Code Playgroud)

现在datetime是模块,您可以通过它来引用包含的类型.

或者,从模块导入所需的所有类型:

from datetime import date, datetime

today_date = date.today()
date_time = datetime.strptime(date_time_string, '%Y-%m-%d %H:%M')
Run Code Online (Sandbox Code Playgroud)

datetime是模块中的类型.date是另一种类型,来自同一模块.

  • 非常感谢Martijn.令人困惑的是他们为什么命名一个与模块同名的类型.我是python的新手并且一般都在发展,所以这可能是某种最佳实践.无论如何,谢谢你. (2认同)