-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
MYPYPATH doesn't respect PEP420 namespace packages #1645
Comments
I know... I'm not sure what to do about this. The algorithm from PEP 420 is quite complex (namespace packages are only considered if no "classic" package or module is found). The workaround of adding a dummy I also expect that usually you'd want to create a separate set of stubs rather than type-check the original source code (though obviously this may vary per package). |
I'd like to bump this. In future, there will be python programmers who never heard of pre PEP420 era of |
It might get the ball rolling if somebody explained why this is such a big problem for mypy. |
I just bumped into Jukka Lehtosalo and he said there shouldn't be any major issue blocking this. But given the easy workaround that exists for this, it'll likely require an outsider to write a PR. |
This issue is more complex than you think. |
I don't think it's trivial, I've read your previous comment - so I don't even think I'd be able to write a PR. I just think it's an issue worth looking into eventually |
I'm working on a project with a directory structure like the following: ./a ./a/c ./a/c/file1.py ./b ./b/c ./b/c/file2.py Note that both, a and b, contain a subfolder called c. Adding an |
I presume you mean in each With that setup, I agree you have a predicament. We will have to support namespace packages in mypy. At the very least it should be possible to do something like setting |
Just a philosophical note here that might influence the way mypy handles this: in my experience in a Py3-only world, packages without This reversal may not have been an intended consequence of PEP 420, but AFAICS it's an inevitable one. |
Or perhaps this reflects your particular culture.
…On Nov 25, 2017 21:48, "Carl Meyer" ***@***.***> wrote:
Just a philosophical note here that might influence the way mypy handles
this: in my experience in a Py3-only world, packages without __init__.py
are not a special edge case for namespace packages, they are the default
case. It's pretty unreasonable to expect a new Py3 developer to remember to
drop empty __init__.py turds everywhere when their code demonstrably runs
perfectly fine without them. It's hard to even make a sensible case in code
review for why they should add __init__.py (other than "it's the way
we've always done things in the old world, get off my lawn" or "the
typechecker is buggy and won't find your code without it.") The presence of
__init__.py becomes the special case, used only when you need some
package-level code or imports.
This reversal may not have been an intended consequence of PEP 420, but
AFAICS it's an inevitable one.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#1645 (comment)>, or mute
the thread
<https://github.com/notifications/unsubscribe-auth/ACwrMunwfsZJ03cqKrWM6ONIipLvzuh_ks5s6Pu5gaJpZM4IuKil>
.
|
Certainly possible. I'd be curious to hear from another Py3-only culture |
This seems to be hitting quite a few people, so raising priority to high. |
This seems to be one the most important Python features that mypy doesn't properly support. Some potential users have told me that they were unable to use mypy because of this. |
Unfortunately the work-around of adding dummy |
Tentative implementation of PEP 420. Fixes #1645. Clarification of the implementation: - `candidate_base_dirs` is a list of `(dir, verify)` tuples, laboriously pre-computed. - The old code just looped over this list, looking for `dir/<module>`, and if found, it would verify that there were `__init__.py` files in all the right places (except if `verify` is false); the first success would be the hit; - In PEP 420 mode, if the above approach finds no hits, we do something different for those paths that failed due to `__init__` verification; essentially we narrow down the list of candidate paths by checking for `__init__` files from the top down. Hopefully the last test added clarifies this.
Tentative implementation of PEP 420. Fixes python#1645. Clarification of the implementation: - `candidate_base_dirs` is a list of `(dir, verify)` tuples, laboriously pre-computed. - The old code just looped over this list, looking for `dir/<module>`, and if found, it would verify that there were `__init__.py` files in all the right places (except if `verify` is false); the first success would be the hit; - In PEP 420 mode, if the above approach finds no hits, we do something different for those paths that failed due to `__init__` verification; essentially we narrow down the list of candidate paths by checking for `__init__` files from the top down. Hopefully the last test added clarifies this.
I want to point out why adding an empty Requiring |
Yeah, that's why we eventually implemented |
And for those that stumble on this issue via Google, that flag was added in 0.640, so make sure you're on that or later, then use the aforementioned |
FYI. For completeness, I'll mention that I recently realized that my patch only works for the top level namespace package. It doesn't help traversing in to nested sub-namespace packages. That doesn't affect us in practice so I'm not motivated to fix it. |
It is the year 2020. Python 3 is the only supported major release of Python. Is using the non-default As a creator of various namespaced packages targeted for Python 3, this requires users of my packages to set this flag to get any type information out of my packages (requiring them to somehow know that my package is a namespace package, carrying all this baggage). Also as a developer of these packages, getting the I would open a PR to change the default but given the discussion here, the decision appears a lot more nuanced and personal than I currently understand, and I do not wish to upset the maintainers. |
I hope that I am not unaware of some context around this issue, but I agree with @nickroeker that it would make sense for the I very recently stumbled into an issue (#8497) that I believe was due to this (adding the Is the main obstacle to making this behaviour default the need for retrocompatibility with Python 2 ? |
I think that the question of the --namespace-packages flag needs to be
raised with the Python people. I am just a user like you.
…On Fri, Mar 13, 2020 at 11:32 PM Erwan de Lépinau ***@***.***> wrote:
I hope that I am not unaware of some context around this issue, but I
agree with @nickroeker <https://github.com/nickroeker> that it would make
sense for the --namespace-packages flag to be the default behaviour for
mypy, especially as the current behaviour is really confusing for Py3-only
users like myself.
I very recently stumbled into an issue (#1645
<#1645>) due to this (adding the
--namespace-packages flag solved it), and being a "relatively new" Python
user that has never used Python 2, I had a very confusing time
understanding why I was expected to add an empty __init__.py in a namespace
package for mypy to work.
Is the main obstacle to making this behaviour default the need for
retrocompatibility with Python 2 ?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#1645 (comment)>, or
unsubscribe
<https://github.com/notifications/unsubscribe-auth/AACZGNN6Y63SWVGXVD5K6YTRHL3F3ANCNFSM4CFYVCSQ>
.
--
Jonathan Gossage
|
Enabling support for namespace packages by default in Python 3 mode sounds like a good thing. Would somebody create a new issue about it? I haven't looked into this in detail, but we might need to fix some issues with namespace package support first. |
I can create an issue this afternoon 👍 |
Add missing __init__.py to workaround python/mypy#1645 Fix mypy type hint issues in the code found from this. Signed-off-by: Sergio Schvezov <[email protected]>
Add missing __init__.py to workaround python/mypy#1645 Fix mypy type hint issues in the code found from this. Signed-off-by: Sergio Schvezov <[email protected]>
I'm confused because I still get the same error when running $ mypy --namespace-packages .
There are no .py[i] files in directory '.' So what exactly is the work-around if --namespace-packages doesn't work? I have several python packages I want to check under the root folder as well various folders and subfolders with python files. I'm probably missing something simple and dumb. Thanks for the help. |
@aloosley It's been a while so I'm not honestly sure anymore, but I think for Aside from that, I find I generally need to run |
@aloosley @nickroeker alternatively you can use the
|
The behaviour is buggy in mypy v0.790 and earlier, this should be fixed in v0.800 |
Take this directory tree:
And this MYPYPATH:
then running
mypy -p namespace.package
gives:However, mypy works fine when you add an empty
__init__.py
intonamepace
(turning it into a regular package).The text was updated successfully, but these errors were encountered: