Skip to content

Support exhaustive checking for “in” operator.#3

Open
Malika1109 wants to merge 37 commits into
masterfrom
in-exhaustive-checking
Open

Support exhaustive checking for “in” operator.#3
Malika1109 wants to merge 37 commits into
masterfrom
in-exhaustive-checking

Conversation

@Malika1109

@Malika1109 Malika1109 commented Dec 2, 2023

Copy link
Copy Markdown
Owner

This PR attempts to fix python#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 python#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

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@a-khaldi a-khaldi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great Job! I see that there are some errors with the testing, and I'll get working on that!

@ssaloos ssaloos left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see that there are some false positives; will get started on that ASAP!

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@Malika1109 Malika1109 changed the title support for In exhaustive checking Support exhaustive checking for “in” operator. Dec 5, 2023
@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

github-actions Bot commented Dec 6, 2023

Copy link
Copy Markdown

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]

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]

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]

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)

4 participants