Подтвердить что ты не робот

AttributeError при использовании "import dateutil" и "dateutil.parser.parse()", но при использовании "from dateutil import parser" нет проблем,

Я играл с dateutil module в Python 2.7.3. Я просто хотел использовать:

import dateutil
dateutil.parser.parse("01-02-2013")

Но у меня есть ошибка:

AttributeError: 'module' object has no attribute 'parser'

Я проверил, какие атрибуты dateutil имеет:

print dir(dateutil)
# output: ['__author__', '__builtins__', '__doc__', '__file__', '__license__',
#          '__name__', '__package__', '__path__', '__version__']

Дело в том, что когда я пытаюсь импортировать parser из dateutil напрямую, он, кажется, существует:

from dateutil import parser
print parser.parse("01-02-2013")
# output: 2013-01-02 00:00:00

После from dateutil import parser, parser также волшебным образом появился в импортированном dateutil:

print dir(dateutil)
# output: ['__author__', '__builtins__', '__doc__', '__file__', '__license__',
#          '__name__', '__package__', '__path__', '__version__', 'parser',
#          'relativedelta', 'tz']

Обратите внимание, что в этом списке все еще отсутствуют некоторые другие атрибуты (например, rrule).

Кто-нибудь знает, что происходит?

4b9b3361

Ответ 1

Вы не импортировали dateutil.parser. Вы можете это увидеть, но вам нужно как-то импортировать его.

>>> import dateutil.parser
>>> dateutil.parser.parse("01-02-2013")
datetime.datetime(2013, 1, 2, 0, 0)

Это потому, что parser.py является модулем в пакете dateutil. Это отдельный файл в структуре папок.

Отвечайте на вопрос, который вы задали в комментариях, причина, по которой relativedelta и tz появляются в пространстве имен после from dateutil import parser, потому что parser сам импортирует relativedelta и tz.

Если вы посмотрите на исходный код dateutil/parser.py, вы увидите импорт.

# -*- coding:iso-8859-1 -*-
"""
Copyright (c) 2003-2007  Gustavo Niemeyer <[email protected]>

This module offers extensions to the standard Python
datetime module.
"""
... snip ...
from . import relativedelta
from . import tz