On Mon, Apr 05, 2004, Shane Holloway (IEEE) wrote: > Aahz wrote: >>On Mon, Apr 05, 2004, Shane Holloway (IEEE) wrote: >>>>Aahz: >>>> >>>>>Good point. Here's what I *think* the semantics are; as soon as I get >>>>>agreement, I'll update the PEP. Given a package layout:: >>>>> >>>>> package >>>>> subpackage1 >>>>> moduleX >>>>> moduleY >>>>> subpackage2 >>>>> moduleZ >>>>> moduleA >>>>> >>>>>Each leading "." refers to one level of parent. Assuming that the >>>>>current file is ``moduleX.py``, following are correct usages of the new >>>>>syntax:: >>>>> >>>>> from .moduleY import spam >>>>> from ..subpackage1 import moduleY >>>>> from ..subpackage2.moduleZ import eggs >>>>> from ..moduleA import foo >>>>> from ...package import bar >>> >>>What about names inside package __init__? >>> >>> from .. import bar >>> >>>Is this also valid? >> >> >>Do you mean subpackage1's __init__.py? If so, yes. For most purposes, >>a package's __init__.py is treated as if it were a module with the name >>of the package. > > Actually, no I meant package's __init__.py -- so that:: > > from .. import bar as barA > from ...package import bar as barB > > assert barA is barB That makes no sense at all; both of those imports are wrong from package's __init__.py. >>Hmmmm... I think I see what you're getting at: how do you access >>subpackage1 from package's __init__.py using relative imports? Seems to >>me that you'd have to do :: >> >> from .package import subpackage1 >> >>Normally, though, subpackages import from their parents, not the other >>way around. > > I would intuit that one would import subpackage1 from package as:: > > from . import subpackage1 > > but that's not explicitly spelled out. Is this correct? Your intuition is wrong. From package's __init__.py, ``from .`` refers to package's parent; to get back into the package, you need to use ``from .package``. It's precisely the same as the example above with moduleX getting ``bar`` -- but because moduleX is two levels down, it needs two more dots. You're getting confused because you think of __init__.py as being a level below the package that contains it; however, __init__.py *IS* the package level. It's the code *for* the package. If anyone else has been confused by this, please let me know and I'll add clarification to the PEP, but I think these consequences are pretty clear if you understand how packages work. -- Aahz (aahz at pythoncraft.com) <*> http://www.pythoncraft.com/ Why is this newsgroup different from all other newsgroups?
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4