-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
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
Make str unpacking check opt-in #15511
base: master
Are you sure you want to change the base?
Conversation
Fixes python#13823. See also python#6406
for more information, see https://pre-commit.ci
Diff from mypy_primer, showing the effect of this PR on open source code: pandas-stubs (https://github.com/pandas-dev/pandas-stubs)
- tests/test_frame.py:2001: error: Unpacking a string is disallowed [misc]
- tests/test_frame.py:2007: error: Unpacking a string is disallowed [misc]
- tests/test_series.py:606: error: Unpacking a string is disallowed [misc]
- tests/test_series.py:612: error: Unpacking a string is disallowed [misc]
operator (https://github.com/canonical/operator)
- ops/framework.py:166: error: Unpacking a string is disallowed [misc]
aiohttp (https://github.com/aio-libs/aiohttp)
+ aiohttp/client_reqrep.py:350: error: Unused "type: ignore" comment [unused-ignore]
+ aiohttp/web_log.py:206: error: Unused "type: ignore" comment [unused-ignore]
+ aiohttp/web_log.py:207: error: Unused "type: ignore[has-type]" comment [unused-ignore]
+ aiohttp/web_log.py:208: error: Unused "type: ignore[has-type]" comment [unused-ignore]
+ aiohttp/web_log.py:209: error: Unused "type: ignore[has-type]" comment [unused-ignore]
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree that it makes sense to make this an opt-in check, since it can generate false positives. Left some minor comments, looks good overall.
|
||
.. _code-str-unpacking: | ||
|
||
Check that ``str`` is explicitly unpacked [str-unpacking] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The title is a bit unclear. What about something like "Check that 'str' is not unpacked?". Or "... is not unpacked implicitly", though I'm not sure what's the difference between explicit and implicit unpacking here.
Bikeshedding: what about renaming the error code to str-unpack
, which would be a bit shorter?
Check that ``str`` is explicitly unpacked [str-unpacking] | ||
--------------------------------------------------------- | ||
|
||
It can sometimes be surprising that ``str`` is iterable, especially when unpacking. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Explicitly enumerate the contexts where this matters (for loop, assignment)?
@@ -3491,7 +3491,11 @@ def check_multi_assignment( | |||
self.check_multi_assignment_from_union( | |||
lvalues, rvalue, rvalue_type, context, infer_lvalue_type | |||
) | |||
elif isinstance(rvalue_type, Instance) and rvalue_type.type.fullname == "builtins.str": | |||
elif ( | |||
self.msg.errors.is_error_code_enabled(codes.STR_UNPACKING) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this included in --strict
, and should it be?
elif ( | ||
self.msg.errors.is_error_code_enabled(codes.STR_UNPACKING) | ||
and isinstance(rvalue_type, Instance) | ||
and rvalue_type.type.fullname == "builtins.str" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will this check unpacking on Literal strings? Can you add a testcase for that please?
Any idea when this could be merged? |
Fixes #13823. See also #6406