Skip to content

Commit 15cd6d3

Browse files
authored
Set default strict_optional state to True (#18198)
1 parent 30a2007 commit 15cd6d3

File tree

4 files changed

+71
-46
lines changed

4 files changed

+71
-46
lines changed

mypy/state.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ def strict_optional_set(self, value: bool) -> Iterator[None]:
2424
self.strict_optional = saved
2525

2626

27-
state: Final = StrictOptionalState(strict_optional=False)
27+
state: Final = StrictOptionalState(strict_optional=True)
2828
find_occurrences: tuple[str, str] | None = None

mypy/test/testsubtypes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from mypy.subtypes import is_subtype
55
from mypy.test.helpers import Suite
66
from mypy.test.typefixture import InterfaceTypeFixture, TypeFixture
7-
from mypy.types import Instance, Type, UnpackType
7+
from mypy.types import Instance, Type, UninhabitedType, UnpackType
88

99

1010
class SubtypingSuite(Suite):
@@ -87,7 +87,7 @@ def test_basic_callable_subtyping(self) -> None:
8787
)
8888

8989
self.assert_strict_subtype(
90-
self.fx.callable(self.fx.a, self.fx.nonet), self.fx.callable(self.fx.a, self.fx.a)
90+
self.fx.callable(self.fx.a, UninhabitedType()), self.fx.callable(self.fx.a, self.fx.a)
9191
)
9292

9393
self.assert_unrelated(

mypy/test/testtypes.py

Lines changed: 67 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -766,18 +766,19 @@ def test_type_vars(self) -> None:
766766
self.assert_join(self.fx.t, self.fx.s, self.fx.o)
767767

768768
def test_none(self) -> None:
769-
# Any type t joined with None results in t.
770-
for t in [
771-
NoneType(),
772-
self.fx.a,
773-
self.fx.o,
774-
UnboundType("x"),
775-
self.fx.t,
776-
self.tuple(),
777-
self.callable(self.fx.a, self.fx.b),
778-
self.fx.anyt,
779-
]:
780-
self.assert_join(t, NoneType(), t)
769+
with state.strict_optional_set(False):
770+
# Any type t joined with None results in t.
771+
for t in [
772+
NoneType(),
773+
self.fx.a,
774+
self.fx.o,
775+
UnboundType("x"),
776+
self.fx.t,
777+
self.tuple(),
778+
self.callable(self.fx.a, self.fx.b),
779+
self.fx.anyt,
780+
]:
781+
self.assert_join(t, NoneType(), t)
781782

782783
def test_unbound_type(self) -> None:
783784
self.assert_join(UnboundType("x"), UnboundType("x"), self.fx.anyt)
@@ -798,11 +799,15 @@ def test_unbound_type(self) -> None:
798799

799800
def test_any_type(self) -> None:
800801
# Join against 'Any' type always results in 'Any'.
802+
with state.strict_optional_set(False):
803+
self.assert_join(NoneType(), self.fx.anyt, self.fx.anyt)
804+
801805
for t in [
802806
self.fx.anyt,
803807
self.fx.a,
804808
self.fx.o,
805-
NoneType(),
809+
# TODO: fix this is not currently symmetric
810+
# NoneType(),
806811
UnboundType("x"),
807812
self.fx.t,
808813
self.tuple(),
@@ -834,7 +839,11 @@ def test_other_mixed_types(self) -> None:
834839
self.assert_join(t1, t2, self.fx.o)
835840

836841
def test_simple_generics(self) -> None:
837-
self.assert_join(self.fx.ga, self.fx.nonet, self.fx.ga)
842+
with state.strict_optional_set(False):
843+
self.assert_join(self.fx.ga, self.fx.nonet, self.fx.ga)
844+
with state.strict_optional_set(True):
845+
self.assert_join(self.fx.ga, self.fx.nonet, UnionType([self.fx.ga, NoneType()]))
846+
838847
self.assert_join(self.fx.ga, self.fx.anyt, self.fx.anyt)
839848

840849
for t in [
@@ -1105,22 +1114,24 @@ def test_class_subtyping(self) -> None:
11051114
self.assert_meet(self.fx.a, self.fx.o, self.fx.a)
11061115
self.assert_meet(self.fx.a, self.fx.b, self.fx.b)
11071116
self.assert_meet(self.fx.b, self.fx.o, self.fx.b)
1108-
self.assert_meet(self.fx.a, self.fx.d, NoneType())
1109-
self.assert_meet(self.fx.b, self.fx.c, NoneType())
1117+
self.assert_meet(self.fx.a, self.fx.d, UninhabitedType())
1118+
self.assert_meet(self.fx.b, self.fx.c, UninhabitedType())
11101119

11111120
def test_tuples(self) -> None:
11121121
self.assert_meet(self.tuple(), self.tuple(), self.tuple())
11131122
self.assert_meet(self.tuple(self.fx.a), self.tuple(self.fx.a), self.tuple(self.fx.a))
11141123
self.assert_meet(
11151124
self.tuple(self.fx.b, self.fx.c),
11161125
self.tuple(self.fx.a, self.fx.d),
1117-
self.tuple(self.fx.b, NoneType()),
1126+
self.tuple(self.fx.b, UninhabitedType()),
11181127
)
11191128

11201129
self.assert_meet(
11211130
self.tuple(self.fx.a, self.fx.a), self.fx.std_tuple, self.tuple(self.fx.a, self.fx.a)
11221131
)
1123-
self.assert_meet(self.tuple(self.fx.a), self.tuple(self.fx.a, self.fx.a), NoneType())
1132+
self.assert_meet(
1133+
self.tuple(self.fx.a), self.tuple(self.fx.a, self.fx.a), UninhabitedType()
1134+
)
11241135

11251136
def test_function_types(self) -> None:
11261137
self.assert_meet(
@@ -1143,23 +1154,36 @@ def test_function_types(self) -> None:
11431154
def test_type_vars(self) -> None:
11441155
self.assert_meet(self.fx.t, self.fx.t, self.fx.t)
11451156
self.assert_meet(self.fx.s, self.fx.s, self.fx.s)
1146-
self.assert_meet(self.fx.t, self.fx.s, NoneType())
1157+
self.assert_meet(self.fx.t, self.fx.s, UninhabitedType())
11471158

11481159
def test_none(self) -> None:
11491160
self.assert_meet(NoneType(), NoneType(), NoneType())
11501161

11511162
self.assert_meet(NoneType(), self.fx.anyt, NoneType())
11521163

11531164
# Any type t joined with None results in None, unless t is Any.
1154-
for t in [
1155-
self.fx.a,
1156-
self.fx.o,
1157-
UnboundType("x"),
1158-
self.fx.t,
1159-
self.tuple(),
1160-
self.callable(self.fx.a, self.fx.b),
1161-
]:
1162-
self.assert_meet(t, NoneType(), NoneType())
1165+
with state.strict_optional_set(False):
1166+
for t in [
1167+
self.fx.a,
1168+
self.fx.o,
1169+
UnboundType("x"),
1170+
self.fx.t,
1171+
self.tuple(),
1172+
self.callable(self.fx.a, self.fx.b),
1173+
]:
1174+
self.assert_meet(t, NoneType(), NoneType())
1175+
1176+
with state.strict_optional_set(True):
1177+
self.assert_meet(self.fx.o, NoneType(), NoneType())
1178+
for t in [
1179+
self.fx.a,
1180+
# TODO: fix this is not currently symmetric
1181+
# UnboundType("x"),
1182+
self.fx.t,
1183+
self.tuple(),
1184+
self.callable(self.fx.a, self.fx.b),
1185+
]:
1186+
self.assert_meet(t, NoneType(), UninhabitedType())
11631187

11641188
def test_unbound_type(self) -> None:
11651189
self.assert_meet(UnboundType("x"), UnboundType("x"), self.fx.anyt)
@@ -1197,28 +1221,28 @@ def test_simple_generics(self) -> None:
11971221
self.assert_meet(self.fx.ga, self.fx.ga, self.fx.ga)
11981222
self.assert_meet(self.fx.ga, self.fx.o, self.fx.ga)
11991223
self.assert_meet(self.fx.ga, self.fx.gb, self.fx.gb)
1200-
self.assert_meet(self.fx.ga, self.fx.gd, self.fx.nonet)
1201-
self.assert_meet(self.fx.ga, self.fx.g2a, self.fx.nonet)
1224+
self.assert_meet(self.fx.ga, self.fx.gd, UninhabitedType())
1225+
self.assert_meet(self.fx.ga, self.fx.g2a, UninhabitedType())
12021226

1203-
self.assert_meet(self.fx.ga, self.fx.nonet, self.fx.nonet)
1227+
self.assert_meet(self.fx.ga, self.fx.nonet, UninhabitedType())
12041228
self.assert_meet(self.fx.ga, self.fx.anyt, self.fx.ga)
12051229

12061230
for t in [self.fx.a, self.fx.t, self.tuple(), self.callable(self.fx.a, self.fx.b)]:
1207-
self.assert_meet(t, self.fx.ga, self.fx.nonet)
1231+
self.assert_meet(t, self.fx.ga, UninhabitedType())
12081232

12091233
def test_generics_with_multiple_args(self) -> None:
12101234
self.assert_meet(self.fx.hab, self.fx.hab, self.fx.hab)
12111235
self.assert_meet(self.fx.hab, self.fx.haa, self.fx.hab)
1212-
self.assert_meet(self.fx.hab, self.fx.had, self.fx.nonet)
1236+
self.assert_meet(self.fx.hab, self.fx.had, UninhabitedType())
12131237
self.assert_meet(self.fx.hab, self.fx.hbb, self.fx.hbb)
12141238

12151239
def test_generics_with_inheritance(self) -> None:
12161240
self.assert_meet(self.fx.gsab, self.fx.gb, self.fx.gsab)
1217-
self.assert_meet(self.fx.gsba, self.fx.gb, self.fx.nonet)
1241+
self.assert_meet(self.fx.gsba, self.fx.gb, UninhabitedType())
12181242

12191243
def test_generics_with_inheritance_and_shared_supertype(self) -> None:
1220-
self.assert_meet(self.fx.gsba, self.fx.gs2a, self.fx.nonet)
1221-
self.assert_meet(self.fx.gsab, self.fx.gs2a, self.fx.nonet)
1244+
self.assert_meet(self.fx.gsba, self.fx.gs2a, UninhabitedType())
1245+
self.assert_meet(self.fx.gsab, self.fx.gs2a, UninhabitedType())
12221246

12231247
def test_generic_types_and_dynamic(self) -> None:
12241248
self.assert_meet(self.fx.gdyn, self.fx.ga, self.fx.ga)
@@ -1232,33 +1256,33 @@ def test_callables_with_dynamic(self) -> None:
12321256

12331257
def test_meet_interface_types(self) -> None:
12341258
self.assert_meet(self.fx.f, self.fx.f, self.fx.f)
1235-
self.assert_meet(self.fx.f, self.fx.f2, self.fx.nonet)
1259+
self.assert_meet(self.fx.f, self.fx.f2, UninhabitedType())
12361260
self.assert_meet(self.fx.f, self.fx.f3, self.fx.f3)
12371261

12381262
def test_meet_interface_and_class_types(self) -> None:
12391263
self.assert_meet(self.fx.o, self.fx.f, self.fx.f)
1240-
self.assert_meet(self.fx.a, self.fx.f, self.fx.nonet)
1264+
self.assert_meet(self.fx.a, self.fx.f, UninhabitedType())
12411265

12421266
self.assert_meet(self.fx.e, self.fx.f, self.fx.e)
12431267

12441268
def test_meet_class_types_with_shared_interfaces(self) -> None:
12451269
# These have nothing special with respect to meets, unlike joins. These
12461270
# are for completeness only.
1247-
self.assert_meet(self.fx.e, self.fx.e2, self.fx.nonet)
1248-
self.assert_meet(self.fx.e2, self.fx.e3, self.fx.nonet)
1271+
self.assert_meet(self.fx.e, self.fx.e2, UninhabitedType())
1272+
self.assert_meet(self.fx.e2, self.fx.e3, UninhabitedType())
12491273

12501274
def test_meet_with_generic_interfaces(self) -> None:
12511275
fx = InterfaceTypeFixture()
12521276
self.assert_meet(fx.gfa, fx.m1, fx.m1)
12531277
self.assert_meet(fx.gfa, fx.gfa, fx.gfa)
1254-
self.assert_meet(fx.gfb, fx.m1, fx.nonet)
1278+
self.assert_meet(fx.gfb, fx.m1, UninhabitedType())
12551279

12561280
def test_type_type(self) -> None:
12571281
self.assert_meet(self.fx.type_a, self.fx.type_b, self.fx.type_b)
12581282
self.assert_meet(self.fx.type_b, self.fx.type_any, self.fx.type_b)
12591283
self.assert_meet(self.fx.type_b, self.fx.type_type, self.fx.type_b)
1260-
self.assert_meet(self.fx.type_b, self.fx.type_c, self.fx.nonet)
1261-
self.assert_meet(self.fx.type_c, self.fx.type_d, self.fx.nonet)
1284+
self.assert_meet(self.fx.type_b, self.fx.type_c, self.fx.type_never)
1285+
self.assert_meet(self.fx.type_c, self.fx.type_d, self.fx.type_never)
12621286
self.assert_meet(self.fx.type_type, self.fx.type_any, self.fx.type_any)
12631287
self.assert_meet(self.fx.type_b, self.fx.anyt, self.fx.type_b)
12641288

mypy/test/typefixture.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ def make_type_var(
216216
self.type_d = TypeType.make_normalized(self.d)
217217
self.type_t = TypeType.make_normalized(self.t)
218218
self.type_any = TypeType.make_normalized(self.anyt)
219+
self.type_never = TypeType.make_normalized(UninhabitedType())
219220

220221
self._add_bool_dunder(self.bool_type_info)
221222
self._add_bool_dunder(self.ai)

0 commit comments

Comments
 (0)