使用“import dateutil”和“dateutil.parser.parse()”时的AttributeError,但在使用“from dateutil import parser”时没有问题

时间:2014-04-30 09:55:12

标签: python python-2.7 attributeerror python-dateutil

我在Python 2.7.3中玩dateutil module。我只是想用:

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)。

任何人都知道发生了什么?

1 个答案:

答案 0 :(得分:54)

您尚未导入dateutil.parser。你可以看到它,但你以某种方式导入它。

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

这是因为parser.pydateutil包中的模块。它是文件夹结构中的单独文件。

回答您在评论中提出的问题,relativedeltatz在您from dateutil import parser之后出现在命名空间中的原因是因为parser本身导入relativedeltatz

如果查看dateutil/parser.py的源代码,可以看到导入。

# -*- coding:iso-8859-1 -*-
"""
Copyright (c) 2003-2007  Gustavo Niemeyer <gustavo@niemeyer.net>

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