Repository navigation
Closed
Labels
3.12only security fixesonly security fixesrelease-blockertopic-tkintertype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
turtle.teleport added in #103974 seems not quite correct.
Why?
- It is produced automagically from
Turtle.teleportinstance method. It has this signature:def teleport(self, x=None, y=None, *, fill_gap: bool = False) -> None: - The result function
turtle.teleporthas this signature:def teleport(x, y=None, fill_gap=None)
Notice that it is missing x=None default and for some reason fill_gap is not a kw-only anymore.
The second problem happens because inside it uses inspect.getargs:
Line 3927 in 52fbcf6
| args, varargs, varkw = inspect.getargs(ob.__code__) |
So, when I try to run turtle.teleport I get:
Traceback (most recent call last):
File "/Users/sobolev/Desktop/cpython/ex.py", line 60, in <module>
print(teleport())
^^^^^^^^^^
TypeError: teleport() missing 1 required positional argument: 'x'
And with just one arg:
Traceback (most recent call last):
File "/Users/sobolev/Desktop/cpython/ex.py", line 60, in <module>
print(teleport(1))
^^^^^^^^^^^
File "<string>", line 4, in teleport
TypeError: Turtle.teleport() takes from 1 to 3 positional arguments but 4 were given
Annotations are also missing. It is not a big problem, but it is inconvenient.
I propose using inspect.signature instead. It will allow us using pos-only and keyword-only params with ease.
I have a PR ready.
Found while working on python/typeshed#10548
CC @AlexWaygood and @terryjreedy
Linked PRs
Reacted by Gregory P. Smith
Metadata
Metadata
Assignees
Labels
3.12only security fixesonly security fixesrelease-blockertopic-tkintertype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Projects
- StatusShow more project fieldsDone
Activity
pythongh-107805: Fix signatures of module-level generated functions i…
terryjreedy commentedon Aug 9, 2023
@gpshead merged the PR.
inspect.getargs it not currently documented, likely because it was replaced by inspect.getfullargspec when keyword-only args were added. The latter was replaced by inspect.signature, but kept for 2.x compatibility for 2.x/3.x code. Turtle should definitely be updated to use inspect.signature.
Separate issues: I suspect the same would be true of any stdlib code using either getargs or getfullargspec. We should probably deprecate and remove getargs and maybe eventually getfullargspec.
The getargs call is part of
def getmethparlist(ob), which returns a tuple of separate definition and call signatures. Without checking all uses within turtle, I wonder what the point is. For calls that just want the call signature, I wonder if calling getmethodparlist could be replaced by calling signature.gpshead commentedon Aug 10, 2023
FWIW the bug in the PR adding teleport was added by me as I decided fill_gap should be keyword only for a more readable API feel, without realizing that such gross hacks existed elsewhere within turtle that relied on
inspectin this manner. yuck! good find.gh-107805: Fix signatures of module-level generated functions in `tur…
pythongh-107805: Fix signatures of module-level generated functions i…
[3.12] gh-107805: Fix signatures of module-level generated functions …