mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
bpo-40389: Improve repr of typing.Optional (#19714)
This commit is contained in:
parent
b1e11c31c5
commit
138a9b9c2a
4 changed files with 10 additions and 2 deletions
|
@ -2028,7 +2028,7 @@ class TestDocString(unittest.TestCase):
|
||||||
class C:
|
class C:
|
||||||
x: Union[int, type(None)] = None
|
x: Union[int, type(None)] = None
|
||||||
|
|
||||||
self.assertDocStrEqual(C.__doc__, "C(x:Union[int, NoneType]=None)")
|
self.assertDocStrEqual(C.__doc__, "C(x:Optional[int]=None)")
|
||||||
|
|
||||||
def test_docstring_list_field(self):
|
def test_docstring_list_field(self):
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|
|
@ -1750,7 +1750,7 @@ class GenericTests(BaseTestCase):
|
||||||
self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
|
self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
|
||||||
'Union[Tuple, Tuple[int]]')
|
'Union[Tuple, Tuple[int]]')
|
||||||
self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
|
self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
|
||||||
'Callable[..., Union[int, NoneType]]')
|
'Callable[..., Optional[int]]')
|
||||||
self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
|
self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
|
||||||
'Callable[[], List[int]]')
|
'Callable[[], List[int]]')
|
||||||
|
|
||||||
|
|
|
@ -691,6 +691,13 @@ class _GenericAlias(_Final, _root=True):
|
||||||
return _GenericAlias(self.__origin__, params, name=self._name, inst=self._inst)
|
return _GenericAlias(self.__origin__, params, name=self._name, inst=self._inst)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
if (self.__origin__ == Union and len(self.__args__) == 2
|
||||||
|
and type(None) in self.__args__):
|
||||||
|
if self.__args__[0] is not type(None):
|
||||||
|
arg = self.__args__[0]
|
||||||
|
else:
|
||||||
|
arg = self.__args__[1]
|
||||||
|
return (f'typing.Optional[{_type_repr(arg)}]')
|
||||||
if (self._name != 'Callable' or
|
if (self._name != 'Callable' or
|
||||||
len(self.__args__) == 2 and self.__args__[0] is Ellipsis):
|
len(self.__args__) == 2 and self.__args__[0] is Ellipsis):
|
||||||
if self._name:
|
if self._name:
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
``repr()`` now returns ``typing.Optional[T]`` when called for ``typing.Union`` of two types, one of which is ``NoneType``.
|
Loading…
Add table
Add a link
Reference in a new issue