Issue #24206: Fixed __eq__ and __ne__ methods of inspect classes.
This commit is contained in:
commit
2489bd5d4e
@ -2488,15 +2488,14 @@ class Parameter:
|
|||||||
return hash((self.name, self.kind, self.annotation, self.default))
|
return hash((self.name, self.kind, self.annotation, self.default))
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return (self is other or
|
if self is other:
|
||||||
(issubclass(other.__class__, Parameter) and
|
return True
|
||||||
self._name == other._name and
|
if not isinstance(other, Parameter):
|
||||||
self._kind == other._kind and
|
return NotImplemented
|
||||||
self._default == other._default and
|
return (self._name == other._name and
|
||||||
self._annotation == other._annotation))
|
self._kind == other._kind and
|
||||||
|
self._default == other._default and
|
||||||
def __ne__(self, other):
|
self._annotation == other._annotation)
|
||||||
return not self.__eq__(other)
|
|
||||||
|
|
||||||
|
|
||||||
class BoundArguments:
|
class BoundArguments:
|
||||||
@ -2610,13 +2609,12 @@ class BoundArguments:
|
|||||||
self.arguments = OrderedDict(new_arguments)
|
self.arguments = OrderedDict(new_arguments)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return (self is other or
|
if self is other:
|
||||||
(issubclass(other.__class__, BoundArguments) and
|
return True
|
||||||
self.signature == other.signature and
|
if not isinstance(other, BoundArguments):
|
||||||
self.arguments == other.arguments))
|
return NotImplemented
|
||||||
|
return (self.signature == other.signature and
|
||||||
def __ne__(self, other):
|
self.arguments == other.arguments)
|
||||||
return not self.__eq__(other)
|
|
||||||
|
|
||||||
def __setstate__(self, state):
|
def __setstate__(self, state):
|
||||||
self._signature = state['_signature']
|
self._signature = state['_signature']
|
||||||
@ -2775,12 +2773,11 @@ class Signature:
|
|||||||
return hash((params, kwo_params, return_annotation))
|
return hash((params, kwo_params, return_annotation))
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return (self is other or
|
if self is other:
|
||||||
(isinstance(other, Signature) and
|
return True
|
||||||
self._hash_basis() == other._hash_basis()))
|
if not isinstance(other, Signature):
|
||||||
|
return NotImplemented
|
||||||
def __ne__(self, other):
|
return self._hash_basis() == other._hash_basis()
|
||||||
return not self.__eq__(other)
|
|
||||||
|
|
||||||
def _bind(self, args, kwargs, *, partial=False):
|
def _bind(self, args, kwargs, *, partial=False):
|
||||||
"""Private method. Don't use directly."""
|
"""Private method. Don't use directly."""
|
||||||
|
@ -89,6 +89,9 @@ def gen_coroutine_function_example(self):
|
|||||||
yield
|
yield
|
||||||
return 'spam'
|
return 'spam'
|
||||||
|
|
||||||
|
class EqualsToAll:
|
||||||
|
def __eq__(self, other):
|
||||||
|
return True
|
||||||
|
|
||||||
class TestPredicates(IsTestBase):
|
class TestPredicates(IsTestBase):
|
||||||
|
|
||||||
@ -2672,69 +2675,84 @@ class TestSignatureObject(unittest.TestCase):
|
|||||||
|
|
||||||
def test_signature_equality(self):
|
def test_signature_equality(self):
|
||||||
def foo(a, *, b:int) -> float: pass
|
def foo(a, *, b:int) -> float: pass
|
||||||
self.assertNotEqual(inspect.signature(foo), 42)
|
self.assertFalse(inspect.signature(foo) == 42)
|
||||||
|
self.assertTrue(inspect.signature(foo) != 42)
|
||||||
|
self.assertTrue(inspect.signature(foo) == EqualsToAll())
|
||||||
|
self.assertFalse(inspect.signature(foo) != EqualsToAll())
|
||||||
|
|
||||||
def bar(a, *, b:int) -> float: pass
|
def bar(a, *, b:int) -> float: pass
|
||||||
self.assertEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertTrue(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertFalse(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def bar(a, *, b:int) -> int: pass
|
def bar(a, *, b:int) -> int: pass
|
||||||
self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertFalse(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertTrue(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertNotEqual(
|
self.assertNotEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def bar(a, *, b:int): pass
|
def bar(a, *, b:int): pass
|
||||||
self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertFalse(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertTrue(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertNotEqual(
|
self.assertNotEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def bar(a, *, b:int=42) -> float: pass
|
def bar(a, *, b:int=42) -> float: pass
|
||||||
self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertFalse(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertTrue(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertNotEqual(
|
self.assertNotEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def bar(a, *, c) -> float: pass
|
def bar(a, *, c) -> float: pass
|
||||||
self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertFalse(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertTrue(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertNotEqual(
|
self.assertNotEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def bar(a, b:int) -> float: pass
|
def bar(a, b:int) -> float: pass
|
||||||
self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertFalse(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertTrue(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertNotEqual(
|
self.assertNotEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
def spam(b:int, a) -> float: pass
|
def spam(b:int, a) -> float: pass
|
||||||
self.assertNotEqual(inspect.signature(spam), inspect.signature(bar))
|
self.assertFalse(inspect.signature(spam) == inspect.signature(bar))
|
||||||
|
self.assertTrue(inspect.signature(spam) != inspect.signature(bar))
|
||||||
self.assertNotEqual(
|
self.assertNotEqual(
|
||||||
hash(inspect.signature(spam)), hash(inspect.signature(bar)))
|
hash(inspect.signature(spam)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def foo(*, a, b, c): pass
|
def foo(*, a, b, c): pass
|
||||||
def bar(*, c, b, a): pass
|
def bar(*, c, b, a): pass
|
||||||
self.assertEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertTrue(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertFalse(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def foo(*, a=1, b, c): pass
|
def foo(*, a=1, b, c): pass
|
||||||
def bar(*, c, b, a=1): pass
|
def bar(*, c, b, a=1): pass
|
||||||
self.assertEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertTrue(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertFalse(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def foo(pos, *, a=1, b, c): pass
|
def foo(pos, *, a=1, b, c): pass
|
||||||
def bar(pos, *, c, b, a=1): pass
|
def bar(pos, *, c, b, a=1): pass
|
||||||
self.assertEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertTrue(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertFalse(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def foo(pos, *, a, b, c): pass
|
def foo(pos, *, a, b, c): pass
|
||||||
def bar(pos, *, c, b, a=1): pass
|
def bar(pos, *, c, b, a=1): pass
|
||||||
self.assertNotEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertFalse(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertTrue(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertNotEqual(
|
self.assertNotEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
def foo(pos, *args, a=42, b, c, **kwargs:int): pass
|
def foo(pos, *args, a=42, b, c, **kwargs:int): pass
|
||||||
def bar(pos, *args, c, b, a=42, **kwargs:int): pass
|
def bar(pos, *args, c, b, a=42, **kwargs:int): pass
|
||||||
self.assertEqual(inspect.signature(foo), inspect.signature(bar))
|
self.assertTrue(inspect.signature(foo) == inspect.signature(bar))
|
||||||
|
self.assertFalse(inspect.signature(foo) != inspect.signature(bar))
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
hash(inspect.signature(foo)), hash(inspect.signature(bar)))
|
||||||
|
|
||||||
@ -2907,11 +2925,17 @@ class TestParameterObject(unittest.TestCase):
|
|||||||
P = inspect.Parameter
|
P = inspect.Parameter
|
||||||
p = P('foo', default=42, kind=inspect.Parameter.KEYWORD_ONLY)
|
p = P('foo', default=42, kind=inspect.Parameter.KEYWORD_ONLY)
|
||||||
|
|
||||||
self.assertEqual(p, p)
|
self.assertTrue(p == p)
|
||||||
self.assertNotEqual(p, 42)
|
self.assertFalse(p != p)
|
||||||
|
self.assertFalse(p == 42)
|
||||||
|
self.assertTrue(p != 42)
|
||||||
|
self.assertTrue(p == EqualsToAll())
|
||||||
|
self.assertFalse(p != EqualsToAll())
|
||||||
|
|
||||||
self.assertEqual(p, P('foo', default=42,
|
self.assertTrue(p == P('foo', default=42,
|
||||||
kind=inspect.Parameter.KEYWORD_ONLY))
|
kind=inspect.Parameter.KEYWORD_ONLY))
|
||||||
|
self.assertFalse(p != P('foo', default=42,
|
||||||
|
kind=inspect.Parameter.KEYWORD_ONLY))
|
||||||
|
|
||||||
def test_signature_parameter_replace(self):
|
def test_signature_parameter_replace(self):
|
||||||
p = inspect.Parameter('foo', default=42,
|
p = inspect.Parameter('foo', default=42,
|
||||||
@ -3215,25 +3239,33 @@ class TestBoundArguments(unittest.TestCase):
|
|||||||
def test_signature_bound_arguments_equality(self):
|
def test_signature_bound_arguments_equality(self):
|
||||||
def foo(a): pass
|
def foo(a): pass
|
||||||
ba = inspect.signature(foo).bind(1)
|
ba = inspect.signature(foo).bind(1)
|
||||||
self.assertEqual(ba, ba)
|
self.assertTrue(ba == ba)
|
||||||
|
self.assertFalse(ba != ba)
|
||||||
|
self.assertTrue(ba == EqualsToAll())
|
||||||
|
self.assertFalse(ba != EqualsToAll())
|
||||||
|
|
||||||
ba2 = inspect.signature(foo).bind(1)
|
ba2 = inspect.signature(foo).bind(1)
|
||||||
self.assertEqual(ba, ba2)
|
self.assertTrue(ba == ba2)
|
||||||
|
self.assertFalse(ba != ba2)
|
||||||
|
|
||||||
ba3 = inspect.signature(foo).bind(2)
|
ba3 = inspect.signature(foo).bind(2)
|
||||||
self.assertNotEqual(ba, ba3)
|
self.assertFalse(ba == ba3)
|
||||||
|
self.assertTrue(ba != ba3)
|
||||||
ba3.arguments['a'] = 1
|
ba3.arguments['a'] = 1
|
||||||
self.assertEqual(ba, ba3)
|
self.assertTrue(ba == ba3)
|
||||||
|
self.assertFalse(ba != ba3)
|
||||||
|
|
||||||
def bar(b): pass
|
def bar(b): pass
|
||||||
ba4 = inspect.signature(bar).bind(1)
|
ba4 = inspect.signature(bar).bind(1)
|
||||||
self.assertNotEqual(ba, ba4)
|
self.assertFalse(ba == ba4)
|
||||||
|
self.assertTrue(ba != ba4)
|
||||||
|
|
||||||
def foo(*, a, b): pass
|
def foo(*, a, b): pass
|
||||||
sig = inspect.signature(foo)
|
sig = inspect.signature(foo)
|
||||||
ba1 = sig.bind(a=1, b=2)
|
ba1 = sig.bind(a=1, b=2)
|
||||||
ba2 = sig.bind(b=2, a=1)
|
ba2 = sig.bind(b=2, a=1)
|
||||||
self.assertEqual(ba1, ba2)
|
self.assertTrue(ba1 == ba2)
|
||||||
|
self.assertFalse(ba1 != ba2)
|
||||||
|
|
||||||
def test_signature_bound_arguments_pickle(self):
|
def test_signature_bound_arguments_pickle(self):
|
||||||
def foo(a, b, *, c:1={}, **kw) -> {42:'ham'}: pass
|
def foo(a, b, *, c:1={}, **kw) -> {42:'ham'}: pass
|
||||||
|
@ -19,6 +19,8 @@ Core and Builtins
|
|||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #24206: Fixed __eq__ and __ne__ methods of inspect classes.
|
||||||
|
|
||||||
- Issue #24631: Fixed regression in the timeit module with multiline setup.
|
- Issue #24631: Fixed regression in the timeit module with multiline setup.
|
||||||
|
|
||||||
- Issue #18622: unittest.mock.mock_open().reset_mock would recurse infinitely.
|
- Issue #18622: unittest.mock.mock_open().reset_mock would recurse infinitely.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user