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

Ste*_*ker 36 python attributeerror python-2.7 python-dateutil

我正在使用Python 2.7.3中的dateutil模块.我只是想用:

import dateutil
dateutil.parser.parse("01-02-2013")
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误:

AttributeError: 'module' object has no attribute 'parser'
Run Code Online (Sandbox Code Playgroud)

我查了一下属性dateutil 确实具有:

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

问题是,当我尝试直接导入parserdateutil,它似乎确实存在:

from dateutil import parser
print parser.parse("01-02-2013")
# output: 2013-01-02 00:00:00
Run Code Online (Sandbox Code Playgroud)

之后from dateutil import parser,parser还神奇地出现在了进口dateutil本身:

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

请注意,rrule此列表中仍缺少某些其他属性(如).

谁知道发生了什么?

msv*_*kon 57

你还没有导入dateutil.parser.你可以看到它,但你必须以某种方式导入它.

>>> import dateutil.parser
>>> dateutil.parser.parse("01-02-2013")
datetime.datetime(2013, 1, 2, 0, 0)
Run Code Online (Sandbox Code Playgroud)

那是因为它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
Run Code Online (Sandbox Code Playgroud)

  • 这是不同的,`date`是`datetime.py`文件中的一个类,其中`dateutil.parser`实际上是一个单独的文件,dateutil包中的`parser.py`. (2认同)