From: Yury Selivanov Date: Fri, 21 Feb 2014 06:32:42 +0000 (-0500) Subject: inspect: Fix getfullargspec to support builtin module-level functions. Issue #20711 X-Git-Tag: v3.4.1rc1~233^2~252 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8c185ee12e334007b974b3a421704ffb09ecfca8;p=python inspect: Fix getfullargspec to support builtin module-level functions. Issue #20711 --- diff --git a/Lib/inspect.py b/Lib/inspect.py index 8b7840a1a0..b85fbcca6d 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1827,9 +1827,16 @@ def _signature_fromstr(cls, obj, s, skip_bound_arg=True): p(f.args.kwarg, empty) if self_parameter is not None: + # Possibly strip the bound argument: + # - We *always* strip first bound argument if + # it is a module. + # - We don't strip first bound argument if + # skip_bound_arg is False. assert parameters - if getattr(obj, '__self__', None) and skip_bound_arg: - # strip off self, it's already been bound + _self = getattr(obj, '__self__', None) + self_isbound = _self is not None + self_ismodule = ismodule(_self) + if self_isbound and (self_ismodule or skip_bound_arg): parameters.pop(0) else: # for builtins, self parameter is always positional-only! diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 711d2a3a6b..95c1b324fb 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -643,6 +643,13 @@ class TestClassesAndFunctions(unittest.TestCase): self.assertFullArgSpecEquals(_pickle.Pickler(io.BytesIO()).dump, args_e=['self', 'obj'], formatted='(self, obj)') + self.assertFullArgSpecEquals( + os.stat, + args_e=['path'], + kwonlyargs_e=['dir_fd', 'follow_symlinks'], + kwonlydefaults_e={'dir_fd': None, 'follow_symlinks': True}, + formatted='(path, *, dir_fd=None, follow_symlinks=True)') + @cpython_only @unittest.skipIf(MISSING_C_DOCSTRINGS, "Signature information for builtins requires docstrings")