Oh I know the traceback, I've had many brought to my desk by a confused junior dev, looking a lot like yours truly a few years back. :)

My only problem with it is that it makes people look at "a.py". And if you look at "a.py", you'll see there's a "q" there. While most of us on this list will check for the circular import, it's quite a bit of headscratching as to why Python can't find the "q", when it's right there in the file. Calling out the circular import possibility explicitly makes people look at the _whole_ stack track, and even if real stack traces are quite a bit longer, they'll probably make the connection.

The AttributeError idea is definitely interesting because it's also a major player in circular import confusions. I think it's an ambitious idea, and would be very exciting if it were implemented.

On Tue, Jun 13, 2017 at 3:36 PM, Chris Angelico <rosuav@gmail.com> wrote:
On Wed, Jun 14, 2017 at 8:10 AM, Mahmoud Hashemi <mahmoud@hatnote.com> wrote:
> I didn't interpret the initial email as wanting an error on *all* circular
> imports. Merely those which are unresolvable. I've definitely helped people
> diagnose circular imports and wished there was an error that called that out
> programmatically, even if it's just a string admonition to check for
> circular imports, appended to the ImportError message.

Oh! That could be interesting. How about a traceback in the import chain?

# a.py
import b
q = 1

# b.py
import c

# c.py
from a import q

c.py will trigger an ImportError, but that could say something like... oh look:

$ python3 a.py
Traceback (most recent call last):
  File "a.py", line 1, in <module>
    import b
  File "/home/rosuav/tmp/asdf/b.py", line 1, in <module>
    import c
  File "/home/rosuav/tmp/asdf/c.py", line 1, in <module>
    from a import q
ImportError: cannot import name 'q' from 'a' (/home/rosuav/tmp/asdf/a.py)

Already happens :)

A bit harder, but also possible, would be to have an AttributeError on
a module recognize that an import is happening, and report a possible
circular import. That'd take some engineering, but it would be
helpful. That'd catch cases like:

# c.py
import a
print(a.q)

Is that what you're looking for?

ChrisA
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/