[Python-checkins] cpython: inspect.signature: Check for function-like objects before builtins. Issue #17159

yury.selivanov python-checkins at python.org
Sat Feb 22 00:31:21 CET 2014


http://hg.python.org/cpython/rev/d6aa3fa646e2
changeset: 89320:d6aa3fa646e2
user: Yury Selivanov <yselivanov at sprymix.com>
date: Fri Feb 21 18:30:53 2014 -0500
summary:
 inspect.signature: Check for function-like objects before builtins. Issue #17159
files:
 Lib/inspect.py | 8 ++++----
 Lib/test/test_inspect.py | 16 ++++++++++++++++
 2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/Lib/inspect.py b/Lib/inspect.py
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -1911,15 +1911,15 @@
 
 return sig.replace(parameters=new_params)
 
- if _signature_is_builtin(obj):
- return _signature_from_builtin(Signature, obj,
- skip_bound_arg=skip_bound_arg)
-
 if isfunction(obj) or _signature_is_functionlike(obj):
 # If it's a pure Python function, or an object that is duck type
 # of a Python function (Cython functions, for instance), then:
 return Signature.from_function(obj)
 
+ if _signature_is_builtin(obj):
+ return _signature_from_builtin(Signature, obj,
+ skip_bound_arg=skip_bound_arg)
+
 if isinstance(obj, functools.partial):
 wrapped_sig = _signature_internal(obj.func,
 follow_wrapper_chains,
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -14,6 +14,7 @@
 import types
 import unicodedata
 import unittest
+import unittest.mock
 
 try:
 from concurrent.futures import ThreadPoolExecutor
@@ -1836,6 +1837,21 @@
 ('kwargs', ..., ..., "var_keyword")),
 ...))
 
+ # Test with cython-like builtins:
+ _orig_isdesc = inspect.ismethoddescriptor
+ def _isdesc(obj):
+ if hasattr(obj, '_builtinmock'):
+ return True
+ return _orig_isdesc(obj)
+
+ with unittest.mock.patch('inspect.ismethoddescriptor', _isdesc):
+ builtin_func = funclike(func)
+ # Make sure that our mock setup is working
+ self.assertFalse(inspect.ismethoddescriptor(builtin_func))
+ builtin_func._builtinmock = True
+ self.assertTrue(inspect.ismethoddescriptor(builtin_func))
+ self.assertEqual(inspect.signature(builtin_func), sig_func)
+
 def test_signature_functionlike_class(self):
 # We only want to duck type function-like objects,
 # not classes.
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /