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.

Thanks,
Tom