使用“import dateutil”和“dateutil.parser.parse()”时出现AttributeError,但使用“from dateutil import parser”时没有问题
Posted
技术标签:
【中文标题】使用“import dateutil”和“dateutil.parser.parse()”时出现AttributeError,但使用“from dateutil import parser”时没有问题【英文标题】:AttributeError when using "import dateutil" and "dateutil.parser.parse()" but no problems when using "from dateutil import parser" 【发布时间】:2014-06-16 14:12:03 【问题描述】:我在 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__']
问题是,当我尝试直接从dateutil
导入parser
时,它似乎确实存在:
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】:您尚未导入dateutil.parser
。您可以看到它,但您必须以某种方式导入它。
>>> import dateutil.parser
>>> dateutil.parser.parse("01-02-2013")
datetime.datetime(2013, 1, 2, 0, 0)
这是因为parser.py
是dateutil
包中的一个模块。它是文件夹结构中的一个单独文件。
回答你在 cmets 中提出的问题,relativedelta
和 tz
在你 from dateutil import parser
之后出现在命名空间中的原因是因为 parser
本身导入了 relativedelta
和 tz
。
如果你查看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
【讨论】:
我认为您可以像导入任何其他模块一样导入它。例如,如果我想使用datetime.date.today()
,我会先使用import datetime
,然后再使用print datetime.date.today()
。这对dateutil
不起作用有什么原因吗?
我明白了。那么dateutil
中的所有其他属性(如rrule
)都是单独的文件,因此您总是必须使用import dateutil.[attribute_name]
来使用它们?
不一样,date
是datetime.py
文件中的一个类,而dateutil.parser
实际上是一个单独的文件,parser.py
在dateutil包中。
@Neftas 是的,差不多就是这样。
谢谢!关于为什么在from dateutil import parser
之后,第二个print dir(dateutil)
突然显示relativedelta
和tz
有什么想法吗?以上是关于使用“import dateutil”和“dateutil.parser.parse()”时出现AttributeError,但使用“from dateutil import parser”时没有问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 laravel 8 从 url 中获取动态 start_date 和 end_date(日期范围)?
使用 Date 和 SimpleDateFormat 类表示时间Calendar类和Math类