Infer generic type arguments for slice expressions#18160
Infer generic type arguments for slice expressions#18160hauntsaninja merged 2 commits intopython:masterfrom
Conversation
|
As an alternative approach, I toyed with using the Details--- a/mypy/checkexpr.py
+++ b/mypy/checkexpr.py
@@ -5616,7 +5616,12 @@ class ExpressionChecker(ExpressionVisitor[Type]):
if index:
t = self.accept(index)
self.chk.check_subtype(t, expected, index, message_registry.INVALID_SLICE_INDEX)
- return self.named_type("builtins.slice")
+ args = [
+ TempNode(NoneType()) if arg is None else arg
+ for arg in [e.begin_index, e.end_index, e.stride]
+ ]
+ slice_type = TypeType(self.named_type("builtins.slice"))
+ return self.check_call(slice_type, args, [nodes.ARG_POS] * 3, e, [None] * 3)[0] |
This comment has been minimized.
This comment has been minimized.
hauntsaninja
left a comment
There was a problem hiding this comment.
Nice! Can we record t in the loop so we avoid type checking the index expressions twice?
|
Sure, done! (FWIW, that's how I originally wrote it 😉. I thought to try separating this logic from that loop since I figured it may be removed soon, now that generic slices let us do better checking on slice indices than the hardcoded SupportsIndex/None checks in that loop) |
|
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:2246: error: Expression is of type "tuple[Index[int], slice[None, None, None]]", not "tuple[Index[int], slice[Any, Any, Any]]" [assert-type]
- tests/test_frame.py:226: error: Expression is of type "Any", not "DataFrame" [assert-type]
- tests/test_frame.py:227: error: Expression is of type "Any", not "DataFrame" [assert-type]
|
Fixes #18149
Slices were made generic in python/typeshed#11637. Currently, all slice expressions are inferred to have type
slice[Any, Any, Any]. This PR fills in the generic type arguments more appropriately using start/stop/stride expression types.Given
Before:
After: