[Python-Dev] os.path.join failure mode

Thomas Scrace tom at scrace.org
Sat Feb 9 10:59:13 CET 2013

If a function (or other non-string object) is accidentally passed as an
argument to os.path.join() the result is an AttributeError:

In [3]: os.path.join(fn, "path")
> ---------------------------------------------------------------------------
> AttributeError                            Traceback (most recent call last)
> /home/tom/<ipython-input-3-44b097ceab04> in <module>()
> ----> 1 os.path.join(fn, "path")
> /usr/lib/python2.7/posixpath.pyc in join(a, *p)
>      66         if b.startswith('/'):
>      67             path = b
> ---> 68         elif path == '' or path.endswith('/'):
>      69             path +=  b
>      70         else:
> AttributeError: 'function' object has no attribute 'endswith'

It's relatively easy to run into this if you mean to pass the return value
of a function (fn()) as the argument but accidentally forget to append
parens (()) to the callable, thus passing the function itself instead.

Would it not be more helpful to raise a TypeError("Argument must be a
string") than the slightly more mysterious AttributeError?

It's not the most difficult error in the world to figure out, I admit, but
a TypeError just seems like the more correct thing to do here.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20130209/9060c413/attachment.html>

More information about the Python-Dev mailing list