8000 Backport assert_never change to include repr of value (#371) · python/typing_extensions@2a7945b · GitHub
[go: up one dir, main page]

Skip to content

Commit 2a7945b

Browse files
authored
Backport assert_never change to include repr of value (#371)
1 parent d0a654c commit 2a7945b

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
`__static_attributes__` attribute to all classes in Python,
55
which broke some assumptions made by the implementation of
66
`typing_extensions.Protocol`.
7+
- At runtime, `assert_never` now includes the repr of the argument
8+
in the `AssertionError`. Patch by Hashem, backporting of the original
9+
fix https://github.com/python/cpython/pull/91720 by Jelle Zijlstra.
710

811
# Release 4.11.0 (April 5, 2024)
912

src/test_typing_extensions.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,19 @@ def test_exception(self):
283283
with self.assertRaises(AssertionError):
284284
assert_never(None)
285285

286+
value = "some value"
287+
with self.assertRaisesRegex(AssertionError, value):
288+
assert_never(value)
289+
290+
# Make sure a huge value doesn't get printed in its entirety
291+
huge_value = "a" * 10000
292+
with self.assertRaises(AssertionError) as cm:
293+
assert_never(huge_value)
294+
self.assertLess(
295+
len(cm.exception.args[0]),
296+
typing_extensions._ASSERT_NEVER_REPR_MAX_LENGTH * 2,
297+
)
298+
286299

287300
class OverrideTests(BaseTestCase):
288301
def test_override(self):

src/typing_extensions.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2355,6 +2355,12 @@ def reveal_type(obj: T, /) -> T:
23552355
return obj
23562356

23572357

2358+
if hasattr(typing, "_ASSERT_NEVER_REPR_MAX_LENGTH"): # 3.11+
2359+
_ASSERT_NEVER_REPR_MAX_LENGTH = typing._ASSERT_NEVER_REPR_MAX_LENGTH
2360+
else: # <=3.10
2361+
_ASSERT_NEVER_REPR_MAX_LENGTH = 100
2362+
2363+
23582364
if hasattr(typing, "assert_never"): # 3.11+
23592365
assert_never = typing.assert_never
23602366
else: # <=3.10
@@ -2378,7 +2384,10 @@ def int_or_str(arg: int | str) -> None:
23782384
At runtime, this throws an exception when called.
23792385
23802386
"""
2381-
raise AssertionError("Expected code to be unreachable")
2387+
value = repr(arg)
2388+
if len(value) > _ASSERT_NEVER_REPR_MAX_LENGTH:
2389+
value = value[:_ASSERT_NEVER_REPR_MAX_LENGTH] + '...'
2390+
raise AssertionError(f"Expected code to be unreachable, but got: {value}")
23822391

23832392

23842393
if sys.version_info >= (3, 12): # 3.12+

0 commit comments

Comments
 (0)
0