-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Rework Match.group handling #5557
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
Conversation
Standardize group(), groups(), groupdict(), and __getattr__() to return Any instead of AnyStr. Also special case group(0) and __getattr__(0) to always return AnyStr. Use PEP 604 for unions in changed lines.
I'm arfaid this will cause dead code warnings in mypy, if you do something like this:
Having type checkers say "this is a string" has caused confusion before. See #5269 (comment) for example. |
Maybe we should just use |
Seems like it would also be better for mypyc (it's just one tool that uses typeshed, but an important tool): #5269 (comment) |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
1 similar comment
Diff from mypy_primer, showing the effect of this PR on open source code: sphinx (https://github.com/sphinx-doc/sphinx.git)
+ sphinx/ext/autodoc/__init__.py: note: In member "parse_name" of class "Documenter":
+ sphinx/ext/autodoc/__init__.py:405:23: error: Need type annotation for "parents"
pydantic (https://github.com/samuelcolvin/pydantic.git)
+ pydantic/networks.py:267: error: Item "None" of "Optional[Match[str]]" has no attribute "group" [union-attr]
werkzeug (https://github.com/pallets/werkzeug.git)
+ src/werkzeug/http.py:456: error: Unsupported operand types for + ("str" and "None")
+ src/werkzeug/http.py:456: note: Right operand is of type "Optional[str]"
+ src/werkzeug/http.py:458: error: Incompatible types in assignment (expression has type "Optional[str]", target has type "str")
aiohttp (https://github.com/aio-libs/aiohttp.git)
+ aiohttp/client_reqrep.py:809: error: unused "type: ignore" comment
+ aiohttp/client_reqrep.py:813: error: Argument 1 to "add" of "MultiDict" has incompatible type "Union[str, Any, URL]"; expected "Union[str, istr]" [arg-type]
|
The primer output looks tolerable in my opinion, but we should wait to merge this to after the next mypy release, though, to minimize disruption. |
Now that mypy has released, I'd consider this ready for merge. |
When trying to match `list[T]` and `list[str] | Any`, previously we gave up, because the union items caused conflicting inferred values for `T` (`str` and `Any`). Work around the issue by dropping `Any` constraints if there are multiple sets of contraints, since we prefer more precise types. This fixes false positives resulting from python/typeshed#5557, which changed some return types to contain unions with `Any` items. See mypy primer results in #10881 for a real-world example of this in sphinx.
) When trying to match `list[T]` and `list[str] | Any`, previously we gave up, because the union items caused conflicting inferred values for `T` (`str` and `Any`). Work around the issue by dropping `Any` constraints if there are multiple sets of contraints, since we prefer more precise types. This fixes false positives resulting from python/typeshed#5557, which changed some return types to contain unions with `Any` items. See mypy primer results in #10881 for a real-world example of this in sphinx.
Standardize
group()
,groups()
,groupdict()
, and__getattr__()
to returnAnyStr | Any
instead ofAnyStr
. Also special casegroup(0)
and__getattr__(0)
to always returnAnyStr
. Correctly handle defaults. Use PEP 604 for unions in changed lines.Edited to include changes after review below.
Fixes #3902