-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Internal error checking xarray with --check-untyped-defs
#11007
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
Comments
This is surely a bug in mypy, thanks for the report! I don't know what version of xarray you're running exactly, but looking at master right now, there is a call to |
( @tlambert03 if your project using xarray + mypy is open source, let me know, and I can add it to mypy_primer. It looks like I already have xarray in there, but clearly that wasn't enough) edit: found https://github.com/arviz-devs/arviz.git which reproduces the crash |
The repro case here apparently is just importing xarray, so it's not clear why mypy-primer wouldn't catch that. |
My guess would be because xarray's mypy.ini doesn't have check untyped defs |
here's the most relevant thing I could find about the way xarray uses mypy internally: [mypy]
exclude = properties|asv_bench|doc
files = xarray/**/*.py
show_error_codes = True
# version spanning code is hard to type annotate (and most of this module will
# be going away soon anyways)
[mypy-xarray.core.pycompat]
ignore_errors = True |
but I'm not an xarray developer, I work on a project (napari) which had an xarray import which broke my ability to test our own package. The minimal reproducible example above is just a fresh environment with a couple installs, a single |
Fixes #11007, fixes #10899, fixes #10647 Since the initial implementation of TypeGuard, there have been several fixes quickly applied to make mypy not crash on various TypeGuard things. This includes #10496, #10683 and #11015. We'll discuss how this PR relates to each of these three changes. In particular, #10496 seems incorrect. As A5rocks discusses in #10899 , it introduces confusion between a type guarded variable and a TypeGuard[T]. This PR basically walks back that change entirely and renames TypeGuardType to TypeGuardedType to reduce that possible confusion. Now, we still have the issue that TypeGuardedTypes are getting everywhere and causing unhappiness. I see two high level solutions to this: a) Make TypeGuardedType a proper type, then delegate to the wrapped type in a bunch of type visitors and arbitrary amounts of other places where multiple types interact, and hope that we got all of them, b) Make TypeGuardedType as an improper type (as it was in the original implementation)! Similar to TypeAliasType, it's just a wrapper for another type, so we unwrap it in get_proper_type. This is the approach this PR takes. This might feel controversial, but I think it could be the better option. It also means that if we type check we won't get type guard crashes. #10683 is basically "remove call that leads to crash from the stacktrace". I think the join here (that ends up being with the wrapped type of the TypeGuardedType) is actually fine: if it's different, it tells us that the type changed, which is what we want to know. So seems fine to remove the special casing. Finally, #11015. This is the other contentious part of this PR. I liked the idea of moving the core "type guard overrides narrowing" idea into meet.py, so I kept that. But my changes ended up regressing a reveal_type testTypeGuardNestedRestrictionAny test that was added. But it's not really clear to me how that worked or really, what it tested. I tried writing a simpler version of what I thought the test was meant to test (this is testTypeGuardMultipleCondition added in this PR), but that fails on master. Anyway, this should at least fix the type guard crashes that have been coming up.
Crash Report
Not sure whether this is a mypy issue, or an xarray issue... but I'm getting
RuntimeError: TypeGuard should not appear here
when running mypy on a file that imports xarray when using the--check-untyped-defs
flag. Minimal env on mypy master:To Reproduce
Traceback
Your Environment
--check-untyped-defs
mypy.ini
(and other config files): no config filesThe text was updated successfully, but these errors were encountered: