Skip to content

Support exhaustive checking for “in” operator.#16593

Closed
Malika1109 wants to merge 38 commits intopython:masterfrom
Malika1109:in-exhaustive-checking
Closed

Support exhaustive checking for “in” operator.#16593
Malika1109 wants to merge 38 commits intopython:masterfrom
Malika1109:in-exhaustive-checking

Conversation

@Malika1109
Copy link
Copy Markdown

@Malika1109 Malika1109 commented Dec 1, 2023

This PR attempts to fix #16093

from enum import Enum
from typing import assert_never

class MyEnum(Enum):
A = 1
B = 2
C = 3

def my_function(a: MyEnum) -> bool:
if a == MyEnum.A:
return True
elif a in (MyEnum.B, MyEnum.C):
return False
assert_never(a)

my_function(MyEnum.A)

Earlier the above code would generate the below error:
error: Argument 1 to "assert_never" has incompatible type
"Literal[MyEnum.B, MyEnum.C]"; expected "NoReturn" [arg-type]
assert_never(a)

This PR aims to fix the issue presented in #16093 because creates a separate case for “in” operator to be handled when the right hand side of a comparison expression is TupleExpr.

Through the changes of the pull request my_function passes without any mypy issues:
Project5-Screenshot

@Malika1109 Malika1109 marked this pull request as draft December 1, 2023 04:48
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@JelleZijlstra
Copy link
Copy Markdown
Member

black (https://github.com/psf/black)
+ src/black/__init__.py:530:17: error: Statement is unreachable  [unreachable]
+ src/black/__init__.py:835:17: error: Statement is unreachable  [unreachable]
+ src/black/concurrency.py:139:9: error: Statement is unreachable  [unreachable]

These are all false positives, so the PR has some bugs.

@Malika1109 Malika1109 force-pushed the in-exhaustive-checking branch from ab62edd to ec1c3d4 Compare December 1, 2023 18:21
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

not needed for PR, since tests should cover this
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Dec 6, 2023

Diff from mypy_primer, showing the effect of this PR on open source code:

black (https://github.com/psf/black)
+ src/black/__init__.py:530:17: error: Statement is unreachable  [unreachable]
+ src/black/__init__.py:835:17: error: Statement is unreachable  [unreachable]
+ src/black/concurrency.py:139:9: error: Statement is unreachable  [unreachable]

trio (https://github.com/python-trio/trio)
+ src/trio/_dtls.py:367: error: Need type annotation for "messages_by_seq" (hint: "messages_by_seq: Dict[<type>, <type>] = ...")  [var-annotated]

mkosi (https://github.com/systemd/mkosi)
+ mkosi/config.py:343:9: error: Statement is unreachable  [unreachable]
+ mkosi/qemu.py:428:13: error: Right operand of "or" is never evaluated  [unreachable]
+ mkosi/qemu.py:432:13: error: Statement is unreachable  [unreachable]
+ mkosi/qemu.py:551:13: error: Statement is unreachable  [unreachable]
+ mkosi/distributions/ubuntu.py:27:13: error: Statement is unreachable  [unreachable]
+ mkosi/__init__.py:1356:5: error: Statement is unreachable  [unreachable]
+ mkosi/__init__.py:1381:5: error: Statement is unreachable  [unreachable]
+ mkosi/__init__.py:2309:13: error: Statement is unreachable  [unreachable]
+ mkosi/__init__.py:2802:9: error: Statement is unreachable  [unreachable]
+ mkosi/__init__.py:2805:5: error: Statement is unreachable  [unreachable]

discord.py (https://github.com/Rapptz/discord.py)
- discord/automod.py:316: error: Argument 1 to "_from_value" of "ArrayFlags" has incompatible type "object"; expected "Sequence[int]"  [arg-type]
- discord/automod.py:316: error: Argument "allow_list" to "AutoModTrigger" has incompatible type "object"; expected "list[str] | None"  [arg-type]
- discord/automod.py:321: error: Argument "mention_limit" to "AutoModTrigger" has incompatible type "object"; expected "int | None"  [arg-type]
- discord/automod.py:322: error: Argument "mention_raid_protection" to "AutoModTrigger" has incompatible type "object"; expected "bool | None"  [arg-type]
- discord/automod.py:327: error: Missing return statement  [return]
+ discord/scheduled_event.py:466: error: Need type annotation for "metadata" (hint: "metadata: Dict[<type>, <type>] = ...")  [var-annotated]
- discord/scheduled_event.py:533: error: Incompatible types in assignment (expression has type "None", target has type "str")  [assignment]
- discord/scheduled_event.py:555: error: Incompatible types in assignment (expression has type "dict[str, str]", target has type "str")  [assignment]
+ discord/scheduled_event.py:555: error: Incompatible types in assignment (expression has type "dict[Any, Any]", target has type "str")  [assignment]
+ discord/voice_state.py:278: error: Unused "type: ignore" comment  [unused-ignore]
+ discord/voice_state.py:285: error: Unused "type: ignore" comment  [unused-ignore]
+ discord/guild.py:2400: error: Unused "type: ignore" comment  [unused-ignore]
+ discord/guild.py:3136: error: Need type annotation for "metadata" (hint: "metadata: Dict[<type>, <type>] = ...")  [var-annotated]
- discord/guild.py:3209: error: Incompatible types in assignment (expression has type "dict[str, str]", target has type "str")  [assignment]
+ discord/guild.py:3209: error: Incompatible types in assignment (expression has type "dict[Any, Any]", target has type "str")  [assignment]
+ discord/client.py:2578: error: Unused "type: ignore" comment  [unused-ignore]
- discord/app_commands/tree.py:413: error: Missing return statement  [return]
- discord/app_commands/tree.py:533: error: Missing return statement  [return]

urllib3 (https://github.com/urllib3/urllib3)
+ src/urllib3/poolmanager.py:570: error: Argument 1 to "get" of "dict" has incompatible type "str | None"; expected "str"  [arg-type]

streamlit (https://github.com/streamlit/streamlit)
+ lib/streamlit/runtime/runtime.py: note: In function "stop":
+ lib/streamlit/runtime/runtime.py:307:13: error: Statement is unreachable  [unreachable]
+ lib/streamlit/runtime/runtime.py: note: In member "connect_session" of class "Runtime":
+ lib/streamlit/runtime/runtime.py:371:9: error: Statement is unreachable  [unreachable]
+ lib/streamlit/runtime/runtime.py: note: In member "handle_backmsg" of class "Runtime":
+ lib/streamlit/runtime/runtime.py:479:9: error: Statement is unreachable  [unreachable]
+ lib/streamlit/runtime/runtime.py: note: In member "handle_backmsg_deserialization_exception" of class "Runtime":
+ lib/streamlit/runtime/runtime.py:509:9: error: Statement is unreachable  [unreachable]
+ lib/streamlit/runtime/runtime.py: note: In member "is_ready_for_browser_connection" of class "Runtime":
+ lib/streamlit/runtime/runtime.py:526:13: error: Statement is unreachable  [unreachable]

@hauntsaninja
Copy link
Copy Markdown
Collaborator

Thanks, this logic has been rewritten a few times since this PR, #21456 and preceding PRs fix the relevant issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support exhaustiveness checking for 'in' statements (enums)

6 participants