On Fri, 26 Feb 2016 10:38 am, Ben Finney wrote: > Gregory Ewing <greg.ew...@canterbury.ac.nz> writes: > >> sohcahto...@gmail.com wrote: >> > Now, I've noticed people talking about importing os.path. Is there any >> > reason to use "import os.path" rather than "import os"? Both of them >> > will still put the "os" module into the global namespace. >> >> In the case of os.path it doesn't matter, because the >> os module imports the appropriate path module automatically. > > My position is that behaviour violates one of the principles of the Zen > of Python: “Special cases aren't special enough to break the rules.”
But it's not special. It's the standard behaviour of any module which offers a public name: `import os` makes all the names in the os name space available. There's no difference between (say) `os.listdir` and `os.path` except that listdir happens to be a function and path happens to be a module. `path` has been a documented public attribute of the `os` module since at least Python 1.5: [steve@ando ~]$ python1.5 -c "import os; print os.path" <module 'posixpath' from '/usr/local/lib/python1.5/posixpath.pyc'> and likely older. The documentation from help(os) says: DESCRIPTION This exports: - all functions from posix, nt, os2, mac, or ce, e.g. unlink, stat, etc. - os.path is one of the modules posixpath, ntpath, or macpath (The above is from 2.4, the oldest Python I have that supports docstrings; in 3.3 it is substantially the same except macpath is removed.) Since `os` is not a package, the fact that importing `os.path` works at all is surprising. The os module has to make a special effort to support importing os.path. From the source code: sys.modules['os.path'] = path If you take "Special cases are not special enough" seriously, you will not use `import os.path` since os is not a package: py> os.__package__ '' and os.path is not part of os, it's just a publicly exposed attribute which merely happens to be a module. Being a module doesn't make it special, it's just another name in the os namespace. I trust that you wouldn't insist on writing: import os.listdir (especially since that doesn't work). Neither should you insist on writing `import os.path`, since path is documented as a public part of the os module. It has done so since at least Python 1.5. >> But in general, importing a package won't necessarily >> import submodules under it, so sometimes you need to >> import somepackage.somemodule explicitly. > > Because that's normally the case, I choose not to rely on that special > behaviour of ‘os’. If I need ‘os.path’, I import it explicitly so no > reader needs to guess:: > > import os > import os.path As I have shown above, the fact that os.path is importable at all is the special case. -- Steven -- https://mail.python.org/mailman/listinfo/python-list