summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2022-02-17 03:53:31 (GMT)
committerGitHub <noreply@github.com>2022-02-17 03:53:31 (GMT)
commit29ae7d3996e073ec3f15c4e7486b17c1d0e3c8f5 (patch)
treed08d4aaf483757d9eb7e1d927994573b80aadf16
parenta657bff34945e40be24cd75d02560a93b7623cf5 (diff)
downloadcpython-29ae7d3996e073ec3f15c4e7486b17c1d0e3c8f5.zip
cpython-29ae7d3996e073ec3f15c4e7486b17c1d0e3c8f5.tar.gz
cpython-29ae7d3996e073ec3f15c4e7486b17c1d0e3c8f5.tar.bz2
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> (cherry picked from commit 6e7b813195f9bd6a2a15c1f00ef2c0180f6c751a) Co-authored-by: aha79 <34090357+aha79@users.noreply.github.com>
-rw-r--r--Lib/test/test_typing.py12
-rw-r--r--Lib/typing.py5
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS.d/next/Library/2022-01-11-15-54-15.bpo-46333.B1faiF.rst4
4 files changed, 20 insertions, 2 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 6415273..08eddb0 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -2463,6 +2463,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')
@@ -2499,6 +2503,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
diff --git a/Lib/typing.py b/Lib/typing.py
index 18b21e9..af2d8c7 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -568,10 +568,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 __repr__(self):
return f'ForwardRef({self.__forward_arg__!r})'
diff --git a/Misc/ACKS b/Misc/ACKS
index 61267d2..fe7e692 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -665,6 +665,7 @@ Anders Hammarquist
Mark Hammond
Harald Hanche-Olsen
Manus Hand
+Andreas Hangauer
Milton L. Hankins
Carl Bordum Hansen
Stephen Hansen
diff --git a/Misc/NEWS.d/next/Library/2022-01-11-15-54-15.bpo-46333.B1faiF.rst b/Misc/NEWS.d/next/Library/2022-01-11-15-54-15.bpo-46333.B1faiF.rst
new file mode 100644
index 0000000..ec3c6d5
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-01-11-15-54-15.bpo-46333.B1faiF.rst
@@ -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.