<div dir="ltr"><div>Barry, that kind of circular import is actually fine in many (if not most) cases. Modules are immediately created and importable, thenincrementally populated. The problem arises when you try to do something with contents of the module that have not been populated, usually manifesting in the AttributeError above.<br><br></div><div>If you'd like to test this yourself, I've made a tiny demo with a little bit of documentation: <a href="https://gist.github.com/mahmoud/32fd056a3d4d1cd03a4e8aeff6b5ee70">https://gist.github.com/mahmoud/32fd056a3d4d1cd03a4e8aeff6b5ee70</a><br></div><div><br>Long story short, circular imports can be a code smell, but they're by no means universally an error condition. :)<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jun 18, 2017 at 11:21 AM, Barry Scott <span dir="ltr"><<a href="mailto:barry@barrys-emacs.org" target="_blank">barry@barrys-emacs.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span class=""><blockquote type="cite"><div>On 14 Jun 2017, at 07:33, Nick Coghlan <<a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>> wrote:</div><br class="m_-5613749303825617630Apple-interchange-newline"><div><div>On 14 June 2017 at 13:02, Mahmoud Hashemi <<a href="mailto:mahmoud@hatnote.com" target="_blank">mahmoud@hatnote.com</a>> wrote:<br><blockquote type="cite">That would be amazing! If there's anything I can do to help make that<br>happen, please let me know. It'll almost certainly save that much time for<br>me alone down the line, anyway :)<br></blockquote><br>The `IMPORT_FROM` opcode's error handling would probably be the best<br>place to start poking around:<br><a href="https://github.com/python/cpython/blob/master/Python/ceval.c#L5055" target="_blank">https://github.com/python/<wbr>cpython/blob/master/Python/<wbr>ceval.c#L5055</a><br><br>If you can prove the concept there, that would:<br><br>1. Directly handle the "from x import y" and "import x.y as name" cases<br>2. Provide a starting point for factoring out a "report missing module<br>attribute" helper that could be shared with ModuleType<br><br>As an example of querying _frozen_importlib state from C code, I'd<br>point to <a href="https://github.com/python/cpython/blob/master/Python/import.c#L478" target="_blank">https://github.com/python/<wbr>cpython/blob/master/Python/<wbr>import.c#L478</a><br></div></div></blockquote><div><br></div></span><div>I had thought that the solution would be in the .py implementation of the import</div><div>machinery not in the core C code.</div><div><br></div><div>I was going to simply keep track of the names of the modules that are being imported</div><div>and raise an exception if an import attempted to import a module that had not completed</div><div>being imported. It seems from a quick loom at the code that this would be practical.</div><div><br></div><div>Are you saying that there is a subtle point about import and detection of cycles that</div><div>means the work must be done in C?</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Barry</div><div><br></div><div><br></div><div><br></div><div><br></div><br></font></span><blockquote type="cite"><div><div><span class=""><br>Cheers,<br>Nick.<br><br>P.S. I also double checked that ImportError & AttributeError have<br>compatible binary layouts, so dual inheritance from them works :)<br><br>-- <br>Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>   |   Brisbane, Australia<br></span><span class="">______________________________<wbr>_________________<br>Python-ideas mailing list<br><a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br><a href="https://mail.python.org/mailman/listinfo/python-ideas" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a><br>Code of Conduct: <a href="http://python.org/psf/codeofconduct/" target="_blank">http://python.org/psf/<wbr>codeofconduct/</a><br><br></span></div></div></blockquote></div><br></div></blockquote></div><br></div>