web-dev-qa-db-ja.com

「import dateutil」および「dateutil.parser.parse()」を使用する場合のAttributeError。「from dateutil import parser」を使用する場合は問題ありません。

私は dateutilモジュール in Python 2.7.3。を使いました。

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

しかし、エラーが発生しました:

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

dateutildoesが持つ属性を確認しました。

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 parserparserは、インポートされたdateutil自体にも魔法のように現れています。

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

このリストには、他の属性(rruleなど)がまだないことに注意してください。

誰が何が起こっているのか知っていますか?

36

dateutil.parserをインポートしていません。あなたはそれを見ることができますが、あなたはhave何らかの形でそれをインポートします。

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

parser.pydateutilパッケージ内のモジュールだからです。フォルダー構造内の別のファイルです。

コメントで尋ねた質問への回答、from dateutil import parserの後にrelativedeltatzが名前空間に表示される理由は、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
57
msvalkon