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.