Error on cyclic import from package hidden in a function
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
Research direction
Start by running the reproducer linked in the issue with the shown mypy command, then inspect how package/a.py, package/b.py, and package/init.py are analyzed for cyclic imports and deferred function imports. Compare the package import with the direct package.b import; done means the valid package form no longer produces the reported attribute and undefined-name errors.
Written by the indexing model from the issue text.
Description
I think that mypy incorrectly reports an error. Full steps to reproduce are at https://github.com/lopuhin/mypy-lang-issue-1, but basically, the issue is this: say we have a package package:
package
├── __init__.py
├── a.py
├── b.py
└── test.py
package/a.py has a class that has an import hidden in a function:
class A(object):
def do(self):
from package import do_b # this gives an error
# from package.b import do_b # this works
return do_b(self)
package/b.py defines that do_b function and has an import from package.a in order to have a valid type declaration:
from package.a import A
def do_b(a):
# type: (A) -> str
return 'foo'
package/__init__.py exports do_b from b:
from .b import do_b
And package/test.py is just to check that there is no error on the python level:
from package.a import A
a = A()
print(a.do())
Now, the command mypy --silent-imports --check-untyped-defs package gives the following error:
package/a.py: note: In function "do":
package/a.py:3: error: Module 'package' has no attribute 'do_b'
package/a.py:5: error: Name 'do_b' is not defined
But if we import from package.b directly in package/a.py, the error goes away.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- Avg merge
- 1d 18h
- Merged PRs (30d)
- 54
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from python/mypy
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
documentation
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
-
bug topic-configuration topic-error-reporting
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Similar issues
-
area/auth bug comp/agent P3 platform/discord type/security
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
NousResearch/hermes-agent#117848 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
bancolombia/sentinel#23 ·
-
test md OpenCI
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
langchain-ai/deepagents#6450 ·
-
bug client
Difficulty 2/5 1-3 hours Newbie friendliness 88/100