]> granicus.if.org Git - python/commitdiff
inspect.Signauture.from_function: validate duck functions in Signature constructor...
authorYury Selivanov <yselivanov@sprymix.com>
Fri, 31 Jan 2014 20:21:51 +0000 (15:21 -0500)
committerYury Selivanov <yselivanov@sprymix.com>
Fri, 31 Jan 2014 20:21:51 +0000 (15:21 -0500)
Lib/inspect.py

index bc7eace94353ae99f4029a92547dbeae63b6fb64..48429652317ac2b56c5f1931a4e1bccdce5cd610 100644 (file)
@@ -2097,10 +2097,14 @@ class Signature:
     def from_function(cls, func):
         '''Constructs Signature for the given python function'''
 
-        if not (isfunction(func) or _signature_is_functionlike(func)):
-            # If it's not a pure Python function, and not a duck type
-            # of pure function:
-            raise TypeError('{!r} is not a Python function'.format(func))
+        is_duck_function = False
+        if not isfunction(func):
+            if _signature_is_functionlike(func):
+                is_duck_function = True
+            else:
+                # If it's not a pure Python function, and not a duck type
+                # of pure function:
+                raise TypeError('{!r} is not a Python function'.format(func))
 
         Parameter = cls._parameter_cls
 
@@ -2164,9 +2168,11 @@ class Signature:
             parameters.append(Parameter(name, annotation=annotation,
                                         kind=_VAR_KEYWORD))
 
+        # Is 'func' is a pure Python function - don't validate the
+        # parameters list (for correct order and defaults), it should be OK.
         return cls(parameters,
                    return_annotation=annotations.get('return', _empty),
-                   __validate_parameters__=False)
+                   __validate_parameters__=is_duck_function)
 
     @classmethod
     def from_builtin(cls, func):