AttributeError when using "import dateutil" and "dateutil.parser.parse()" but no problems when using "from dateutil import parser"

StackOverflow https://stackoverflow.com/questions/23385003

Question

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?

Was it helpful?

Solution

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 <gustavo@niemeyer.net>

This module offers extensions to the standard Python
datetime module.
"""
... snip ...
from . import relativedelta
from . import tz
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top