From 8c185ee12e334007b974b3a421704ffb09ecfca8 Mon Sep 17 00:00:00 2001
From: Yury Selivanov <yselivanov@sprymix.com>
Date: Fri, 21 Feb 2014 01:32:42 -0500
Subject: [PATCH] inspect: Fix getfullargspec to support builtin module-level
 functions. Issue #20711

---
 Lib/inspect.py           | 11 +++++++++--
 Lib/test/test_inspect.py |  7 +++++++
 2 files changed, 16 insertions(+), 2 deletions(-)

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")
-- 
2.50.0