Skip to content
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

Support exhaustive checking for “in” operator. #3

Open
wants to merge 37 commits into
base: master
Choose a base branch
from

Conversation

Malika1109
Copy link
Owner

@Malika1109 Malika1109 commented Dec 2, 2023

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

This comment has been minimized.

This comment has been minimized.

Copy link
Collaborator

@a-khaldi a-khaldi left a comment

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!

Copy link
Collaborator

@ssaloos ssaloos left a comment

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!

This comment has been minimized.

This comment has been minimized.

@Malika1109 Malika1109 changed the title support for In exhaustive checking Support exhaustive checking for “in” operator. Dec 5, 2023

This comment has been minimized.

not needed for PR, since tests should cover this

This comment has been minimized.

This comment has been minimized.

Copy link

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]

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