mirror of https://github.com/python/cpython
bpo-46333: Honor `module` parameter in ForwardRef (GH-30536)
The `module` parameter carries semantic information about the forward ref. Forward refs are different if they refer to different module even if they have the same name. This affects the `__eq__`, `__repr__` and `__hash__` methods. Co-authored-by: Andreas Hangauer <andreas.hangauer@siemens.com> Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com>
This commit is contained in:
parent
de6043e596
commit
6e7b813195
|
@ -2800,6 +2800,10 @@ class ForwardRefTests(BaseTestCase):
|
|||
fr = typing.ForwardRef('int')
|
||||
self.assertEqual(fr, typing.ForwardRef('int'))
|
||||
self.assertNotEqual(List['int'], List[int])
|
||||
self.assertNotEqual(fr, typing.ForwardRef('int', module=__name__))
|
||||
frm = typing.ForwardRef('int', module=__name__)
|
||||
self.assertEqual(frm, typing.ForwardRef('int', module=__name__))
|
||||
self.assertNotEqual(frm, typing.ForwardRef('int', module='__other_name__'))
|
||||
|
||||
def test_forward_equality_gth(self):
|
||||
c1 = typing.ForwardRef('C')
|
||||
|
@ -2836,6 +2840,14 @@ class ForwardRefTests(BaseTestCase):
|
|||
self.assertEqual(hash(c1_gth), hash(c2_gth))
|
||||
self.assertEqual(hash(c1), hash(c1_gth))
|
||||
|
||||
c3 = typing.ForwardRef('int', module=__name__)
|
||||
c4 = typing.ForwardRef('int', module='__other_name__')
|
||||
|
||||
self.assertNotEqual(hash(c3), hash(c1))
|
||||
self.assertNotEqual(hash(c3), hash(c1_gth))
|
||||
self.assertNotEqual(hash(c3), hash(c4))
|
||||
self.assertEqual(hash(c3), hash(typing.ForwardRef('int', module=__name__)))
|
||||
|
||||
def test_forward_equality_namespace(self):
|
||||
class A:
|
||||
pass
|
||||
|
|
|
@ -767,10 +767,11 @@ class ForwardRef(_Final, _root=True):
|
|||
if self.__forward_evaluated__ and other.__forward_evaluated__:
|
||||
return (self.__forward_arg__ == other.__forward_arg__ and
|
||||
self.__forward_value__ == other.__forward_value__)
|
||||
return self.__forward_arg__ == other.__forward_arg__
|
||||
return (self.__forward_arg__ == other.__forward_arg__ and
|
||||
self.__forward_module__ == other.__forward_module__)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.__forward_arg__)
|
||||
return hash((self.__forward_arg__, self.__forward_module__))
|
||||
|
||||
def __or__(self, other):
|
||||
return Union[self, other]
|
||||
|
|
|
@ -680,6 +680,7 @@ Anders Hammarquist
|
|||
Mark Hammond
|
||||
Harald Hanche-Olsen
|
||||
Manus Hand
|
||||
Andreas Hangauer
|
||||
Milton L. Hankins
|
||||
Carl Bordum Hansen
|
||||
Stephen Hansen
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
The :meth:`__eq__` and :meth:`__hash__` methods of
|
||||
:class:`typing.ForwardRef` now honor the ``module`` parameter of
|
||||
:class:`typing.ForwardRef`. Forward references from different
|
||||
modules are now differentiated.
|
Loading…
Reference in New Issue