from typing import reveal_type
class HasTupleAttribute:
tuple_attribute: tuple[int, ...]
def __init__(self, _tuple: tuple[int, ...]):
self.tuple_attribute = _tuple
def modify_tuple(self) -> None:
self.tuple_attribute = self.tuple_attribute[:-1]
instance = HasTupleAttribute((1, 2, 3, 4, 5))
reveal_type(instance.tuple_attribute) # Type of "instance.tuple_attribute" is "tuple[int, ...]"
assert len(instance.tuple_attribute) == 5
reveal_type(instance.tuple_attribute) # Type of "instance.tuple_attribute" is "tuple[int, int, int, int, int]"
instance.modify_tuple()
assert len(instance.tuple_attribute) == 4
reveal_type(instance.tuple_attribute) # Type of "instance.tuple_attribute" is "Never"
instance2 = HasTupleAttribute((1, 2, 3, 4, 5))
reveal_type(instance2.tuple_attribute) # Type of "instance.tuple_attribute" is "tuple[int, ...]"
assert len(instance2.tuple_attribute) == 5
reveal_type(instance2.tuple_attribute) # Type of "instance.tuple_attribute" is "tuple[int, int, int, int, int]"
instance2.tuple_attribute = instance2.tuple_attribute[:-1]
assert len(instance2.tuple_attribute) == 4
reveal_type(instance2.tuple_attribute) # Type of "instance.tuple_attribute" is "tuple[int, int, int, int]"
I'm experiencing this both in vscode with the Pylance plugin, and on the pyright playground.
It seems that the possibility of side effects is being ignored, here, so it's trying to narrow to tuple[int, ...] & len(5) & len(4), when it should probably be willing to narrow to tuple[int, ...] & len(4) despite the previous narrowing.
I'm experiencing this both in vscode with the Pylance plugin, and on the pyright playground.
It seems that the possibility of side effects is being ignored, here, so it's trying to narrow to
tuple[int, ...] & len(5) & len(4), when it should probably be willing to narrow totuple[int, ...] & len(4)despite the previous narrowing.