Visitar URL original
Deprecate `gen.throw(typ, val, tb)` · Issue #96348 · python/cpython · GitHub
Skip to content

Deprecate gen.throw(typ, val, tb) #96348

Description

@gvanrossum

CC: @iritkatriel

Issue GH-89874 gets rid of exception triples where it makes sense. I don't know if it was considered, but another place where such triples are supported is the gen.throw(). It allows passing either an exception, or a (type, value, traceback) triple where the value and traceback are optional. I think it makes sense to keep allowing passing an exception type, but I don't see the use case for passing separate type and value. We could deprecate this easily by adding a warning to gen_throw() when more than one argument is present.

Thoughts?

Activity

  1. rhettinger commented on Aug 28, 2022

    @rhettinger
    Contributor

    This would be a nice simplification. AFAICT, the three argument form is rarely used, so deprecating that variant won't be disruptive. Also, when the signature becomes METH_O, calls to gen.throw will get faster.

  2. changed the title [-]Deprecate `gen.throw(typ, val, exc)`[/-] [+]Deprecate `gen.throw(typ, val, tb)`[/+] on Aug 28, 2022
  3. iritkatriel commented on Aug 28, 2022

    @iritkatriel
    Member

    Yes, this would be good. The triplet is not just wasteful, it's also ambiguous when val.__traceback__ != tb.

  4. self-assigned this
    on Aug 28, 2022
  5. gvanrossum commented on Aug 28, 2022

    @gvanrossum
    MemberAuthor

    I wonder if this could be marked as an "easy" issue for someone with moderate C skills to tackle? All you have to do (for now) is issue a deprecation warning if the arg count is larger than 1. (And update some docs.)

  6. removed their assignment
    on Aug 28, 2022
  7. iritkatriel commented on Aug 28, 2022

    @iritkatriel
    Member

    Marked as easy, but also as release-blocker for 3.12 so we won't forget.

  8. ofey404 commented on Aug 29, 2022

    @ofey404
    Contributor

    I wonder if this could be marked as an "easy" issue for someone with moderate C skills to tackle? All you have to do (for now) is issue a deprecation warning if the arg count is larger than 1. (And update some docs.)

    Does it locate in Objects/iterobject.c? I'm trying to become a core developer and willing to help.

    static PyObject *
    anextawaitable_throw(anextawaitableobject *obj, PyObject *arg) {
    return anextawaitable_proxy(obj, "throw", arg);
    }

    And the (type, value, traceback) triple documentation:

    help(a.throw)
    Help on built-in function throw:
    
    throw(...) method of builtins.generator instance
        throw(typ[,val[,tb]]) -> raise exception in generator,
        return next yielded value or raise StopIteration.
    
  9. 12 remaining items

  10. ofey404 commented on Aug 31, 2022

    @ofey404
    Contributor

    The problem size is not so large. I'll try to submit a version fixing them.

    With regex throw\(.*,.*,.*\), there are 51 results in 12 files.

  11. iritkatriel commented on Aug 31, 2022

    @iritkatriel
    Member

    Not all of them need to be ‘fixed’ though.

    Some of the tests are testing the deprecated API and need to stay (with the deprecation warning suppressed).

    lib2to3 maps the deprecated form to the single arg form. It should not change.

    Also, I would run the tests and see what fails rather than rely on a regex search.

  12. iritkatriel commented on Aug 31, 2022

    @iritkatriel
    Member

    Note also that just emitting a deprecation warning doesn’t cause tests to fail (we don’t run the tests with warnings-as-errors in CI).

    This is why I suggested the change in #96348 (comment), because that actually causes most (if not all) of the test failures.

  13. ofey404 commented on Aug 31, 2022

    @ofey404
    Contributor

    This is why I suggested the change in #96348 (comment), because that actually causes most (if not all) of the test failures.

    You're right.

  14. removed their assignment
    on Sep 14, 2022
  15. added a commit that references this issue on Sep 30, 2022
  16. ofey404 commented on Sep 30, 2022

    @ofey404
    Contributor

    Should we close this since the PR is merged?

  17. Repository owner moved this from Todo to Done in Release and Deferred blockers 🚫on Sep 30, 2022
  18. added a commit that references this issue on Oct 2, 2022
  19. gvanrossum commented on Oct 11, 2022

    @gvanrossum
    MemberAuthor
  20. AdamWill commented on Oct 28, 2023

    @AdamWill
    Contributor

    Wasn't this deprecation rather aggressive?

    For generators at least, the single-argument form was only added in Python 3.9, at least according to the docs. It's not mentioned in the 3.8 docs, it only appears in the 3.9 docs.

    3.8 is still in support for another whole year. So if I'm trying to fix something - like twisted - to not print deprecation warnings constantly on Python 3.12, I either have to break it for a still-supported version of Python, or use some kind of rather ugly conditional to figure out what to pass it, right?

  21. AdamWill commented on Oct 28, 2023

    @AdamWill
    Contributor

    ...or is this similar to #105269 and the single-argument form was actually added earlier, but not documented?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions