Skip to content

Commit ed28da3

Browse files
Remove SequenceIncompleteValue (#519)
1 parent 40065df commit ed28da3

File tree

2 files changed

+1
-128
lines changed

2 files changed

+1
-128
lines changed

docs/changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
- Remove `SequenceIncompleteValue` (#519)
56
- Add implementation function for `dict.pop` (#517)
67
- Remove `WeakExtension` (#517)
78
- Fix propagation of no-return-unless constraints from calls

pyanalyze/value.py

Lines changed: 0 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ def function(x: int, y: list[int], z: Any):
5151
import pyanalyze
5252
from pyanalyze.extensions import CustomCheck
5353

54-
from .find_unused import used
5554
from .safe import all_of_type, safe_equals, safe_issubclass, safe_isinstance
5655

5756
T = TypeVar("T")
@@ -1023,133 +1022,6 @@ def simplify(self) -> GenericValue:
10231022
return GenericValue(self.typ, [arg])
10241023

10251024

1026-
# TODO(jelle): Replace with SequenceValue
1027-
@used # for compatibility for now
1028-
@dataclass(unsafe_hash=True, init=False)
1029-
class SequenceIncompleteValue(GenericValue):
1030-
"""A :class:`TypedValue` subclass representing a sequence of known type and length.
1031-
1032-
For example, the expression ``[int(self.foo)]`` may be typed as
1033-
``SequenceIncompleteValue(list, [TypedValue(int)])``.
1034-
1035-
This is only used for ``set``, ``list``, and ``tuple``.
1036-
1037-
This type is being phased out in favor of :class:`SequenceValue`.
1038-
1039-
"""
1040-
1041-
members: Tuple[Value, ...]
1042-
"""The elements of the sequence."""
1043-
1044-
def __init__(self, typ: Union[type, str], members: Sequence[Value]) -> None:
1045-
if members:
1046-
args = (unite_values(*members),)
1047-
else:
1048-
args = (AnyValue(AnySource.unreachable),)
1049-
super().__init__(typ, args)
1050-
self.members = tuple(members)
1051-
1052-
@classmethod
1053-
def make_or_known(
1054-
cls, typ: type, members: Sequence[Value]
1055-
) -> Union[KnownValue, "SequenceIncompleteValue"]:
1056-
if all_of_type(members, KnownValue):
1057-
return KnownValue(typ(member.val for member in members))
1058-
else:
1059-
return SequenceIncompleteValue(typ, members)
1060-
1061-
def can_assign(self, other: Value, ctx: CanAssignContext) -> CanAssign:
1062-
if isinstance(other, SequenceIncompleteValue):
1063-
can_assign = self.get_type_object(ctx).can_assign(self, other, ctx)
1064-
if isinstance(can_assign, CanAssignError):
1065-
return CanAssignError(
1066-
f"Cannot assign {stringify_object(other.typ)} to"
1067-
f" {stringify_object(self.typ)}"
1068-
)
1069-
my_len = len(self.members)
1070-
their_len = len(other.members)
1071-
if my_len != their_len:
1072-
type_str = stringify_object(self.typ)
1073-
return CanAssignError(
1074-
f"Cannot assign {type_str} of length {their_len} to {type_str} of"
1075-
f" length {my_len}"
1076-
)
1077-
if my_len == 0:
1078-
return {} # they're both empty
1079-
bounds_maps = [can_assign]
1080-
for i, (my_member, their_member) in enumerate(
1081-
zip(self.members, other.members)
1082-
):
1083-
can_assign = my_member.can_assign(their_member, ctx)
1084-
if isinstance(can_assign, CanAssignError):
1085-
return CanAssignError(
1086-
f"Types for member {i} are incompatible", [can_assign]
1087-
)
1088-
bounds_maps.append(can_assign)
1089-
return unify_bounds_maps(bounds_maps)
1090-
elif isinstance(other, SequenceValue):
1091-
can_assign = self.get_type_object(ctx).can_assign(self, other, ctx)
1092-
if isinstance(can_assign, CanAssignError):
1093-
return CanAssignError(
1094-
f"Cannot assign {stringify_object(other.typ)} to"
1095-
f" {stringify_object(self.typ)}"
1096-
)
1097-
my_len = len(self.members)
1098-
their_len = len(other.members)
1099-
if my_len != their_len:
1100-
type_str = stringify_object(self.typ)
1101-
return CanAssignError(
1102-
f"Cannot assign {type_str} of length {their_len} to {type_str} of"
1103-
f" length {my_len}"
1104-
)
1105-
if my_len == 0:
1106-
return {} # they're both empty
1107-
bounds_maps = [can_assign]
1108-
for i, (my_member, (is_many, their_member)) in enumerate(
1109-
zip(self.members, other.members)
1110-
):
1111-
if is_many:
1112-
return CanAssignError(
1113-
f"Member {i} is a single element, but an unpacked type is"
1114-
" provided"
1115-
)
1116-
can_assign = my_member.can_assign(their_member, ctx)
1117-
if isinstance(can_assign, CanAssignError):
1118-
return CanAssignError(
1119-
f"Types for member {i} are incompatible", [can_assign]
1120-
)
1121-
bounds_maps.append(can_assign)
1122-
return unify_bounds_maps(bounds_maps)
1123-
return super().can_assign(other, ctx)
1124-
1125-
def substitute_typevars(self, typevars: TypeVarMap) -> Value:
1126-
return SequenceIncompleteValue(
1127-
self.typ, [member.substitute_typevars(typevars) for member in self.members]
1128-
)
1129-
1130-
def __str__(self) -> str:
1131-
members = ", ".join(str(m) for m in self.members)
1132-
if self.typ is tuple:
1133-
return f"tuple[{members}]"
1134-
return f"<{stringify_object(self.typ)} containing [{members}]>"
1135-
1136-
def walk_values(self) -> Iterable[Value]:
1137-
yield self
1138-
for member in self.members:
1139-
yield from member.walk_values()
1140-
1141-
def simplify(self) -> GenericValue:
1142-
if self.typ is tuple:
1143-
return SequenceIncompleteValue(
1144-
tuple, [member.simplify() for member in self.members]
1145-
)
1146-
members = [member.simplify() for member in self.members]
1147-
arg = unite_values(*members)
1148-
if arg is NO_RETURN_VALUE:
1149-
arg = AnyValue(AnySource.unreachable)
1150-
return GenericValue(self.typ, [arg])
1151-
1152-
11531025
@dataclass(frozen=True)
11541026
class KVPair:
11551027
"""Represents a single entry in a :class:`DictIncompleteValue`."""

0 commit comments

Comments
 (0)