mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	Issue 24298: Fix signature() to properly unwrap wrappers around bound methods
This commit is contained in:
		
						commit
						507cd3cf91
					
				
					 3 changed files with 25 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -2130,6 +2130,15 @@ def _signature_from_callable(obj, *,
 | 
			
		|||
    # Was this function wrapped by a decorator?
 | 
			
		||||
    if follow_wrapper_chains:
 | 
			
		||||
        obj = unwrap(obj, stop=(lambda f: hasattr(f, "__signature__")))
 | 
			
		||||
        if isinstance(obj, types.MethodType):
 | 
			
		||||
            # If the unwrapped object is a *method*, we might want to
 | 
			
		||||
            # skip its first parameter (self).
 | 
			
		||||
            # See test_signature_wrapped_bound_method for details.
 | 
			
		||||
            return _signature_from_callable(
 | 
			
		||||
                obj,
 | 
			
		||||
                follow_wrapper_chains=follow_wrapper_chains,
 | 
			
		||||
                skip_bound_arg=skip_bound_arg,
 | 
			
		||||
                sigcls=sigcls)
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        sig = obj.__signature__
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2086,6 +2086,19 @@ def __call__(*, a):
 | 
			
		|||
        with self.assertRaisesRegex(ValueError, 'invalid method signature'):
 | 
			
		||||
            self.signature(Test())
 | 
			
		||||
 | 
			
		||||
    def test_signature_wrapped_bound_method(self):
 | 
			
		||||
        # Issue 24298
 | 
			
		||||
        class Test:
 | 
			
		||||
            def m1(self, arg1, arg2=1) -> int:
 | 
			
		||||
                pass
 | 
			
		||||
        @functools.wraps(Test().m1)
 | 
			
		||||
        def m1d(*args, **kwargs):
 | 
			
		||||
            pass
 | 
			
		||||
        self.assertEqual(self.signature(m1d),
 | 
			
		||||
                         ((('arg1', ..., ..., "positional_or_keyword"),
 | 
			
		||||
                           ('arg2', 1, ..., "positional_or_keyword")),
 | 
			
		||||
                          int))
 | 
			
		||||
 | 
			
		||||
    def test_signature_on_classmethod(self):
 | 
			
		||||
        class Test:
 | 
			
		||||
            @classmethod
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -248,6 +248,9 @@ Library
 | 
			
		|||
- Issue #23898: Fix inspect.classify_class_attrs() to support attributes
 | 
			
		||||
  with overloaded __eq__ and __bool__.  Patch by Mike Bayer.
 | 
			
		||||
 | 
			
		||||
- Issue #24298: Fix inspect.signature() to correctly unwrap wrappers
 | 
			
		||||
  around bound methods.
 | 
			
		||||
 | 
			
		||||
IDLE
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue