Skip to content

turtle.teleport has incorrect-ish signature #107805

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
sobolevn opened this issue Aug 9, 2023 · 2 comments
Closed

turtle.teleport has incorrect-ish signature #107805

sobolevn opened this issue Aug 9, 2023 · 2 comments
Assignees
Labels
3.12 only security fixes release-blocker topic-tkinter type-bug An unexpected behavior, bug, or error

Comments

@sobolevn
Copy link
Member

sobolevn commented Aug 9, 2023

Bug report

turtle.teleport added in #103974 seems not quite correct.

Why?

  1. It is produced automagically from Turtle.teleport instance method. It has this signature: def teleport(self, x=None, y=None, *, fill_gap: bool = False) -> None:
  2. The result function turtle.teleport has 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:

args, varargs, varkw = inspect.getargs(ob.__code__)
which translates kw-only to positional-or-keyword params.

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

@sobolevn sobolevn added type-bug An unexpected behavior, bug, or error topic-tkinter labels Aug 9, 2023
@sobolevn sobolevn self-assigned this Aug 9, 2023
sobolevn added a commit to sobolevn/cpython that referenced this issue Aug 9, 2023
@terryjreedy
Copy link
Member

@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
Copy link
Member

gpshead commented 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 inspect in this manner. yuck! good find.

gpshead pushed a commit that referenced this issue Sep 1, 2023
…tle` (#107807)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
miss-islington pushed a commit to miss-islington/cpython that referenced this issue Sep 1, 2023
…n `turtle` (pythonGH-107807)

(cherry picked from commit 044b8b3)

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Yhg1s pushed a commit that referenced this issue Sep 1, 2023
…in `turtle` (GH-107807) (#108749)

gh-107805: Fix signatures of module-level generated functions in `turtle` (GH-107807)
(cherry picked from commit 044b8b3)

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
@gpshead gpshead closed this as completed Sep 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.12 only security fixes release-blocker topic-tkinter type-bug An unexpected behavior, bug, or error
Projects
Development

No branches or pull requests

3 participants