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