python "импорт datetime" V. s. " из datetime импорт datetime"
у меня есть скрипт, который должен выполнить следующее в разных строках скрипта:
today_date = datetime.date.today()
date_time = datetime.strp(date_time_string, '%Y-%m-%d %H:%M')
в моих операторах импорта у меня есть следующее:
from datetime import datetime
import datetime
Я получаю следующую ошибку:
AttributeError: 'module' object has no attribute 'strp'
если я изменю порядок операторов импорта на:
import datetime
from datetime import datetime
Я получаю следующую ошибку:
AttributeError: 'method_descriptor' object has no attribute 'today'
если я снова изменю оператор импорта на:
import datetime
Я получаю следующее ошибка:
AttributeError: 'module' object has no attribute 'strp'
что здесь происходит и как мне заставить обоих работать? Ценить это. Спасибо.
5 ответов
ваша проблема в том, что у вас есть какой-то код, который ожидает datetime
чтобы быть ссылкой на datetime
модуль и другой код, который ожидает datetime
чтобы быть ссылкой на datetime
класса. очевидно, это не может быть и то, и другое.
если вы:
from datetime import datetime
import datetime
вы первая настройка datetime
чтобы быть ссылкой на класс, а затем сразу же установить его как ссылку на модуль. Когда ты делаешь все наоборот, это то же самое, но в конечном итоге это ссылка на класс.
нужно переименовать одну из этих ссылок. Например:
import datetime as dt
from datetime import datetime
затем вы можете изменить ссылки в виде datetime.xxxx
это относится к модулю dt.xxxx
.
или import datetime
и измените все ссылки, чтобы использовать имя модуля. Другими словами, если что-то просто говорит datetime(...)
вам нужно изменить ссылки на datetime.datetime
.
Python имеет справедливый бит такого рода к сожалению, вещи в его библиотеке. Если бы они следовали своим собственным рекомендациям по именованию в PEP 8 на datetime
класса и не было бы никаких проблем с использованием как datetime
значит модуль и Datetime
значит класс.
вы не можете использовать оба оператора;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')
теперь datetime
является модулем, и вы ссылаетесь на содержащиеся типы через это.
кроме того, импорт все типы, которые вам нужны из модуля:
from datetime import date, datetime
today_date = date.today()
date_time = datetime.strptime(date_time_string, '%Y-%m-%d %H:%M')
здесь datetime
- Это тип из модуля. date
другой тип из того же модуля.
datetime
- это модуль, который содержит тип, который также называется datetime
. Кажется, вы хотите использовать оба, но вы пытаетесь использовать одно и то же имя для обозначения обоих. Тип и модуль-это две разные вещи, и вы не можете ссылаться на них обоих с именем datetime
в вашей программе.
Если вам нужно использовать что-нибудь из модуля, кроме datetime
тип (как ты думаешь), то вам нужно импортировать модуль с import datetime
. Затем вы можете обратиться к "дата" типа как datetime.date
и тип datetime как datetime.datetime
.
вы также можете сделать это:
from datetime import datetime, date
today_date = date.today()
date_time = datetime.strp(date_time_string, '%Y-%m-%d %H:%M')
здесь вы импортируете только нужные вам имена (типы datetime и date) и импортируете их напрямую, поэтому вам не нужно ссылаться на сам модуль.
в конечном счете вы должны решить, какие имена из модуля нужно использовать, и как лучше их использовать. Если вы используете только одну или две вещи из модуля (например, только date
и datetime
типы), возможно, можно импортировать эти имена напрямую. Если вы используете много вещей, вероятно, лучше импортировать модуль и получить доступ к вещам внутри него с помощью синтаксиса точек, чтобы избежать загромождения вашего глобального пространства имен конкретными именами даты.
Обратите также внимание, что если вы импортируете само имя модуля, вы можете сократить имя, чтобы облегчить ввод:
import datetime as dt
today_date = dt.date.today()
date_time = dt.datetime.strp(date_time_string, '%Y-%m-%d %H:%M')
разница между импортом datetime datetime и обычным импортом datetime заключается в том, что вы имеете дело с модулем в одно время и классом в другое.
функция strptime существует только в классе datetime, поэтому вам нужно импортировать класс с модулем, иначе вы должны указать datetime дважды при вызове этой функции.
дело в том, что имя класса и имя модуля получили одно и то же имя, поэтому он создает немного confusuion.
попробуйте это:
import datetime
from datetime import datetime as dt
today_date = datetime.date.today()
date_time = dt.strptime(date_time_string, '%Y-%m-%d %H:%M')
strp () не существует. Я думаю, вы имеете в виду strptime.