<p><br>
On Mar 14, 2012 11:56 PM, &quot;Guido van Rossum&quot; &lt;<a href="mailto:guido@python.org">guido@python.org</a>&gt; wrote:<br>
&gt;<br>
&gt; On Wed, Mar 14, 2012 at 8:33 PM, PJ Eby &lt;<a href="mailto:pje@telecommunity.com">pje@telecommunity.com</a>&gt; wrote:<br>
&gt; &gt; On Mon, Mar 12, 2012 at 11:49 PM, Guido van Rossum &lt;<a href="mailto:guido@python.org">guido@python.org</a>&gt; wrote:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; So the only backwards incompatibility is that &quot;import foo&quot; may succeed<br>
&gt; &gt;&gt; where it previously failed if there is a directory foo/ somewhere on<br>
&gt; &gt;&gt; sys.path but no foo.py and no foo/__init__.py anywhere. I don&#39;t think<br>
&gt; &gt;&gt; this is a big deal.<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; Actually, it *is* a big deal.  An early draft of PEP 402 was like the<br>
&gt; &gt; newly-proposed approach, and it was shot down by an *actual code sample from<br>
&gt; &gt; a real package* that somebody posted to show the problem.  The motivating<br>
&gt; &gt; example is actually presented in the PEP: trying to &quot;import json&quot; with a<br>
&gt; &gt; json/ directory present -- and the &quot;json&quot; package *not* present -- and then<br>
&gt; &gt; trying to use its contents.  The PEP works around this by taking the<br>
&gt; &gt; namespace concept to its logical extreme and saying you can only import the<br>
&gt; &gt; *contents* of the namespace, because the namespace itself doesn&#39;t exist.<br>
&gt; &gt;  (i.e., it&#39;s virtual.)<br>
&gt; &gt;<br>
&gt; &gt; tl;dr version: the killer problem with allowing &quot;import foo&quot; to succeed is<br>
&gt; &gt; that code which does try/except ImportError to test for a package&#39;s presence<br>
&gt; &gt; will get false positives.  That&#39;s the motivating reason for only allowing<br>
&gt; &gt; sub-namespace package imports to succeed: it prevents the immediate breakage<br>
&gt; &gt; of real code, the moment the feature is introduced.  :-(<br>
&gt;<br>
&gt; Well, too bad. It&#39;s too much of a wart. Such try/except clauses make<br>
&gt; me sad anyway -- and we&#39;re trying to get rid of them by e.g.<br>
&gt; encouraging the pattern where heapq.py tries to import _heapq rather<br>
&gt; than having user code try first _heapq and then heapq. (And the idiom<br>
&gt; used in heapq.py doesn&#39;t mind if _heapq exists as an empty package.)</p>
<p>While I agree it is a wart, the heapq.py example might not be the best. A more real-world example might be the situation is PEP 417, where we&#39;ll be seeing people write</p>
<p>try:<br>
    import unittest.mock<br>
except ImportError:<br>
    import mock</p>
<p>And owning neither the two modules, the _ trick is not available.</p>
<p>I like the idea that if a package is only an implied namespace package, with no contents of it&#39;s own, it cannot itself be directly imported. This still allows the simple check, but without seriously modifying the new feature itself.</p>

<p>&gt;<br>
&gt; --<br>
&gt; --Guido van Rossum (<a href="http://python.org/~guido">python.org/~guido</a>)<br>
&gt; _______________________________________________<br>
&gt; Import-SIG mailing list<br>
&gt; <a href="mailto:Import-SIG@python.org">Import-SIG@python.org</a><br>
&gt; <a href="http://mail.python.org/mailman/listinfo/import-sig">http://mail.python.org/mailman/listinfo/import-sig</a></p>