mirror of https://github.com/python/cpython
Issue #20184: Add signature introspection for 30 of the builtins
Also adds a test to test_inspect to track progress on builtin introspection support, to ensure it doesn't regress in the future.
This commit is contained in:
parent
eed671910f
commit
f9e227e5a9
|
@ -1,3 +1,4 @@
|
|||
import builtins
|
||||
import collections
|
||||
import datetime
|
||||
import functools
|
||||
|
@ -23,7 +24,7 @@ except ImportError:
|
|||
ThreadPoolExecutor = None
|
||||
|
||||
from test.support import run_unittest, TESTFN, DirsOnSysPath, cpython_only
|
||||
from test.support import MISSING_C_DOCSTRINGS
|
||||
from test.support import MISSING_C_DOCSTRINGS, cpython_only
|
||||
from test.script_helper import assert_python_ok, assert_python_failure
|
||||
from test import inspect_fodder as mod
|
||||
from test import inspect_fodder2 as mod2
|
||||
|
@ -1623,6 +1624,57 @@ class MyParameter(inspect.Parameter):
|
|||
# used in test_signature_object_pickle
|
||||
pass
|
||||
|
||||
@cpython_only
|
||||
@unittest.skipIf(MISSING_C_DOCSTRINGS,
|
||||
"Signature information for builtins requires docstrings")
|
||||
def test_builtins_have_signatures(self):
|
||||
# This checks all builtin callables in CPython have signatures
|
||||
# A few have signatures Signature can't yet handle, so we skip those
|
||||
# since they will have to wait until PEP 457 adds the required
|
||||
# introspection support to the inspect module
|
||||
# Some others also haven't been converted yet for various other
|
||||
# reasons, so we also skip those for the time being, but design
|
||||
# the test to fail in order to indicate when it needs to be
|
||||
# updated.
|
||||
no_signature = set()
|
||||
# These need PEP 457 groups
|
||||
needs_groups = ["range", "slice", "dir", "getattr",
|
||||
"next", "iter", "vars"]
|
||||
no_signature |= needs_groups
|
||||
# These need PEP 457 groups or a signature change to accept None
|
||||
needs_semantic_update = ["round"]
|
||||
no_signature |= needs_semantic_update
|
||||
# These need *args support in Argument Clinic
|
||||
needs_varargs = ["min", "max", "print", "__build_class__"]
|
||||
no_signature |= needs_varargs
|
||||
# These simply weren't covered in the initial AC conversion
|
||||
# for builtin callables
|
||||
not_converted_yet = ["open", "__import__"]
|
||||
no_signature |= not_converted_yet
|
||||
# These builtin types are expected to provide introspection info
|
||||
types_with_signatures = set()
|
||||
# Check the signatures we expect to be there
|
||||
ns = vars(builtins)
|
||||
for name, obj in sorted(ns.items()):
|
||||
if not callable(obj):
|
||||
continue
|
||||
# The builtin types haven't been converted to AC yet
|
||||
if isinstance(obj, type) and (name not in types_with_signatures):
|
||||
# Note that this also skips all the exception types
|
||||
no_signature.append(name)
|
||||
if (name in no_signature):
|
||||
# Not yet converted
|
||||
continue
|
||||
with self.subTest(builtin=name):
|
||||
self.assertIsNotNone(inspect.signature(obj))
|
||||
# Check callables that haven't been converted don't claim a signature
|
||||
# This ensures this test will start failing as more signatures are
|
||||
# added, so the affected items can be moved into the scope of the
|
||||
# regression test above
|
||||
for name in no_signature:
|
||||
with self.subTest(builtin=name):
|
||||
self.assertIsNone(ns[name].__text_signature__)
|
||||
|
||||
|
||||
class TestSignatureObject(unittest.TestCase):
|
||||
@staticmethod
|
||||
|
|
|
@ -10,6 +10,9 @@ Release date: TBA
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #20184: Argument Clinic based signature introspection added for
|
||||
30 of the builtin functions.
|
||||
|
||||
- Issue #22116: C functions and methods (of the 'builtin_function_or_method'
|
||||
type) can now be weakref'ed. Patch by Wei Wu.
|
||||
|
||||
|
|
1569
Python/bltinmodule.c
1569
Python/bltinmodule.c
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue