I was playing with the dateutil
module in Python 2.7.3. I simply wanted to use:
import dateutil
dateutil.parser.parse("01-02-2013")
But I got an error:
AttributeError: 'module' object has no attribute 'parser'
I checked what attributes dateutil
does have:
print dir(dateutil)
# output: ['__author__', '__builtins__', '__doc__', '__file__', '__license__',
# '__name__', '__package__', '__path__', '__version__']
The thing is, when I try to import parser
from dateutil
directly, it does seem to exist:
from dateutil import parser
print parser.parse("01-02-2013")
# output: 2013-01-02 00:00:00
After the from dateutil import parser
, parser
has also magically appeared in the imported dateutil
itself:
print dir(dateutil)
# output: ['__author__', '__builtins__', '__doc__', '__file__', '__license__',
# '__name__', '__package__', '__path__', '__version__', 'parser',
# 'relativedelta', 'tz']
Note that some other attributes (like rrule
) are still missing from this list.
Anyone knows what's going on?
You haven't imported dateutil.parser
. You can see it, but you have to somehow import it.
>>> import dateutil.parser
>>> dateutil.parser.parse("01-02-2013")
datetime.datetime(2013, 1, 2, 0, 0)
That's because the parser.py
is a module in the dateutil
package. It's a separate file in the folder structure.
Answer to the question you asked in the comments, the reason why relativedelta
and tz
appear in the namespace after you've from dateutil import parser
is because parser
itself imports relativedelta
and tz
.
If you look at the source code of dateutil/parser.py
, you can see the imports.
# -*- 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