I have a directory tree as follows:
main.py
dir1
  sub1.py
  sub2.py
In main.py:
import dir1.sub1
In dir1/sub1.py:
def f1() -> None:
    print("f1")
import dir1.sub2
dir1.sub2.f2()
In dir1/sub2.py:
import dir1.sub1
def f2() -> None:
    dir1.sub1.f1()
    print("f2")
When I run main.py, I get the following error message:
Traceback (most recent call last):
  File "...\main.py", line 1, in <module>
    import dir1.sub1
  File "...\dir1\sub1.py", line 7, in <module>
    dir1.sub2.f2()
  File "...\dir1\sub2.py", line 5, in f2
    dir1.sub1.f1()
AttributeError: module 'dir1' has no attribute 'sub1'. Did you mean: 'sub2'?
(Where the ... at the beginning of the file path is my working directory.)
If I change main.py to
import dir1.sub2
I get a slightly different error message:
Traceback (most recent call last):
  File "...\main.py", line 1, in <module>
    import dir1.sub2
  File "...\dir1\sub2.py", line 1, in <module>
    import dir1.sub1
  File "...\dir1\sub1.py", line 7, in <module>
    dir1.sub2.f2()
AttributeError: module 'dir1' has no attribute 'sub2'
If I move sub1.py and sub2.py to the same directory as main.py and re‐direct imports as necessary, I get the expected output of
f1
f2
Why does this happen, and how can I make it not happen?