[Python-Dev] Re: PEP 328 -- relative and multi-line import

Aahz aahz at pythoncraft.com
Mon Apr 5 13:36:24 EDT 2004


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?



More information about the Python-Dev mailing list