Skip to content

Commit 138a9b9

Browse files
authored
bpo-40389: Improve repr of typing.Optional (python#19714)
1 parent b1e11c3 commit 138a9b9

File tree

4 files changed

+10
-2
lines changed

4 files changed

+10
-2
lines changed

Lib/test/test_dataclasses.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2028,7 +2028,7 @@ def test_docstring_one_field_with_default_none(self):
20282028
class C:
20292029
x: Union[int, type(None)] = None
20302030

2031-
self.assertDocStrEqual(C.__doc__, "C(x:Union[int, NoneType]=None)")
2031+
self.assertDocStrEqual(C.__doc__, "C(x:Optional[int]=None)")
20322032

20332033
def test_docstring_list_field(self):
20342034
@dataclass

Lib/test/test_typing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1750,7 +1750,7 @@ def test_extended_generic_rules_repr(self):
17501750
self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
17511751
'Union[Tuple, Tuple[int]]')
17521752
self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
1753-
'Callable[..., Union[int, NoneType]]')
1753+
'Callable[..., Optional[int]]')
17541754
self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
17551755
'Callable[[], List[int]]')
17561756

Lib/typing.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,13 @@ def copy_with(self, params):
691691
return _GenericAlias(self.__origin__, params, name=self._name, inst=self._inst)
692692

693693
def __repr__(self):
694+
if (self.__origin__ == Union and len(self.__args__) == 2
695+
and type(None) in self.__args__):
696+
if self.__args__[0] is not type(None):
697+
arg = self.__args__[0]
698+
else:
699+
arg = self.__args__[1]
700+
return (f'typing.Optional[{_type_repr(arg)}]')
694701
if (self._name != 'Callable' or
695702
len(self.__args__) == 2 and self.__args__[0] is Ellipsis):
696703
if self._name:
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
``repr()`` now returns ``typing.Optional[T]`` when called for ``typing.Union`` of two types, one of which is ``NoneType``.

0 commit comments

Comments
 (0)