<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Apr 22, 2015 at 10:33 AM, Eric Snow <span dir="ltr"><<a href="mailto:ericsnowcurrently@gmail.com" target="_blank">ericsnowcurrently@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Wed, Apr 22, 2015 at 11:15 AM, Guido van Rossum <<a href="mailto:guido@python.org">guido@python.org</a>> wrote:<br>
> It's definitely intentional, and it's fundamental to the package import<br>
> design. We've had many implementations of package import (remember "ni.py"?<br>
> last seen as "knee.py") and it was always there, because this is done as<br>
> part of *submodule loading*. For better or for worse (and because I didn't<br>
> know Java at the time :-) Python declares that if you write `import foo.bar`<br>
> then later in your code you can use `foo.bar` to reference to the bar<br>
> submodule of package foo. And the way this is done is to make each submodule<br>
> an attribute of its parent package. This is done when the submodule is first<br>
> loaded, and because of the strict separation between loading and importing,<br>
> it is done no matter what form of import was used to load bar.<br>
<br>
</span>Exactly.  "import spam.eggs; spam.eggs" looks up "spam" and then its<br>
"eggs" attribute, so "eggs" has to be bound during the import.<br>
<br>
The surprising part is that it also happens for explicit relative<br>
imports.  I'm guessing that part was unintentional and simply not<br>
noticed when PEP 328 was implemented.<br></blockquote><div><br></div><div>No, that must also have been intentional, because even when you use relative import, the module you imported knows its full name, and that full name is used as its key in sys.modules. If someone else uses absolute import for the same module they should still get the same module object.<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
> I guess another thing to realize is that the globals of __init__.py are also<br>
> the attribute namespace of the package.<br>
<br>
</span>Do you think this is confusing for anyone?  It seems obvious to me,<br>
but I'm pretty familiar with the import system. :)<span class="HOEnZb"></span><br></blockquote></div><br></div><div class="gmail_extra">When you look at it from a different angle it's totally obvious. But apparently it surprised Dave and Barry.<br clear="all"></div><div class="gmail_extra"><br>-- <br><div class="gmail_signature">--Guido van Rossum (<a href="http://python.org/~guido" target="_blank">python.org/~guido</a>)</div>
</div></div>