Skip to content

Commit 8a562a8

Browse files
committed
Reword not-required compatibility error messages
Refer to deletion in error messages for incompatibility mutable not-required fields in base classes, as this is simpler, and ultimately the reason why there is an incompatibility
1 parent 306e27a commit 8a562a8

2 files changed

Lines changed: 6 additions & 7 deletions

File tree

mypy/semanal_typeddict.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,18 +311,17 @@ def verify_field_compatibility(
311311
)
312312
else:
313313
self.fail(
314-
f'Field "{field_name}" is required in base class "{source.base_name}" but not in base class "{primary_source_base_name}"',
314+
f'Field "{field_name}" is required in base class "{source.base_name}" but can be deleted in base class "{primary_source_base_name}"',
315315
ctx,
316316
)
317317
elif not source.is_required and not source.is_readonly and is_required:
318318
if primary_source_base_name is None:
319319
self.fail(
320-
f'Field "{field_name}" is not required and not readonly in base class "{source.base_name}"',
321-
ctx,
320+
f'Field "{field_name}" can be deleted in base class "{source.base_name}"', ctx
322321
)
323322
else:
324323
self.fail(
325-
f'Field "{field_name}" is required in base class "{primary_source_base_name}" but not in base class "{source.base_name}"',
324+
f'Field "{field_name}" is required in base class "{primary_source_base_name}" but can be deleted in base class "{source.base_name}"',
326325
ctx,
327326
)
328327

test-data/unit/check-typeddict.test

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ class Point1(TypedDict):
354354
x: int
355355
class Point2(TypedDict, total=False):
356356
x: int
357-
class Bad(Point1, Point2): # E: Field "x" is required in base class "Point1" but not in base class "Point2"
357+
class Bad(Point1, Point2): # E: Field "x" is required in base class "Point1" but can be deleted in base class "Point2"
358358
pass
359359

360360
b: Bad
@@ -382,7 +382,7 @@ class Point1(TypedDict, total=False):
382382
x: int
383383
class Point2(TypedDict):
384384
x: int
385-
class Bad(Point1, Point2): # E: Field "x" is required in base class "Point2" but not in base class "Point1"
385+
class Bad(Point1, Point2): # E: Field "x" is required in base class "Point2" but can be deleted in base class "Point1"
386386
pass
387387

388388
b: Bad
@@ -396,7 +396,7 @@ from typing import TypedDict
396396
class Point1(TypedDict, total=False):
397397
x: int
398398
class Point2(Point1):
399-
x: int # E: Field "x" is not required and not readonly in base class "Point1"
399+
x: int # E: Field "x" can be deleted in base class "Point1"
400400

401401
p2: Point2
402402
reveal_type(p2) # N: Revealed type is "TypedDict('__main__.Point2', {'x': builtins.int})"

0 commit comments

Comments
 (0)