mirror of
https://github.com/python/cpython
synced 2024-10-14 23:49:42 +00:00
[3.12] gh-107805: Fix signatures of module-level generated functions in turtle
(GH-107807) (#108749)
gh-107805: Fix signatures of module-level generated functions in `turtle` (GH-107807)
(cherry picked from commit 044b8b3b6a
)
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
parent
1e15c1501c
commit
56683097f4
|
@ -461,5 +461,25 @@ def test_teleport(self):
|
|||
self.assertTrue(tpen.isdown())
|
||||
|
||||
|
||||
class TestModuleLevel(unittest.TestCase):
|
||||
def test_all_signatures(self):
|
||||
import inspect
|
||||
|
||||
known_signatures = {
|
||||
'teleport':
|
||||
'(x=None, y=None, *, fill_gap: bool = False) -> None',
|
||||
'undo': '()',
|
||||
'goto': '(x, y=None)',
|
||||
'bgcolor': '(*args)',
|
||||
'pen': '(pen=None, **pendict)',
|
||||
}
|
||||
|
||||
for name in known_signatures:
|
||||
with self.subTest(name=name):
|
||||
obj = getattr(turtle, name)
|
||||
sig = inspect.signature(obj)
|
||||
self.assertEqual(str(sig), known_signatures[name])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
|
@ -3951,28 +3951,33 @@ def getmethparlist(ob):
|
|||
function definition and the second is suitable for use in function
|
||||
call. The "self" parameter is not included.
|
||||
"""
|
||||
defText = callText = ""
|
||||
orig_sig = inspect.signature(ob)
|
||||
# bit of a hack for methods - turn it into a function
|
||||
# but we drop the "self" param.
|
||||
# Try and build one for Python defined functions
|
||||
args, varargs, varkw = inspect.getargs(ob.__code__)
|
||||
items2 = args[1:]
|
||||
realArgs = args[1:]
|
||||
defaults = ob.__defaults__ or []
|
||||
defaults = ["=%r" % (value,) for value in defaults]
|
||||
defaults = [""] * (len(realArgs)-len(defaults)) + defaults
|
||||
items1 = [arg + dflt for arg, dflt in zip(realArgs, defaults)]
|
||||
if varargs is not None:
|
||||
items1.append("*" + varargs)
|
||||
items2.append("*" + varargs)
|
||||
if varkw is not None:
|
||||
items1.append("**" + varkw)
|
||||
items2.append("**" + varkw)
|
||||
defText = ", ".join(items1)
|
||||
defText = "(%s)" % defText
|
||||
callText = ", ".join(items2)
|
||||
callText = "(%s)" % callText
|
||||
return defText, callText
|
||||
func_sig = orig_sig.replace(
|
||||
parameters=list(orig_sig.parameters.values())[1:],
|
||||
)
|
||||
|
||||
call_args = []
|
||||
for param in func_sig.parameters.values():
|
||||
match param.kind:
|
||||
case (
|
||||
inspect.Parameter.POSITIONAL_ONLY
|
||||
| inspect.Parameter.POSITIONAL_OR_KEYWORD
|
||||
):
|
||||
call_args.append(param.name)
|
||||
case inspect.Parameter.VAR_POSITIONAL:
|
||||
call_args.append(f'*{param.name}')
|
||||
case inspect.Parameter.KEYWORD_ONLY:
|
||||
call_args.append(f'{param.name}={param.name}')
|
||||
case inspect.Parameter.VAR_KEYWORD:
|
||||
call_args.append(f'**{param.name}')
|
||||
case _:
|
||||
raise RuntimeError('Unsupported parameter kind', param.kind)
|
||||
call_text = f'({', '.join(call_args)})'
|
||||
|
||||
return str(func_sig), call_text
|
||||
|
||||
def _turtle_docrevise(docstr):
|
||||
"""To reduce docstrings from RawTurtle class for functions
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Fix signatures of module-level generated functions in :mod:`turtle`.
|
Loading…
Reference in a new issue