Skip to content
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

fix returning tuples from async fns #4407

Merged
merged 1 commit into from
Aug 1, 2024
Merged

Conversation

birkenfeld
Copy link
Member

Fixes #4400

As the return value is ultimately communicated back via a StopIteration exception instance, a peculiar behavior of PyErr::new is encountered here: when the argument is a tuple arg, it is used to construct the exception as if calling from Python Exception(*arg) and not Exception(arg) like for every other type of argument.

This comes from from CPython's PyErr_SetObject which ultimately calls _PyErr_CreateException where the "culprit" is found here: https://github.com/python/cpython/blob/main/Python/errors.c#L33

We can fix this particular bug in the invocation of PyErr::new but it is a more general question if we want to keep reflecting this somewhat surprising CPython behavior, or create a better API, introducing a breaking change.

Fixes PyO3#4400

As the return value is ultimately communicated back via a StopIteration
exception instance, a peculiar behavior of `PyErr::new` is encountered
here: when the argument is a tuple `arg`, it is used to construct the
exception as if calling from Python `Exception(*arg)` and not
`Exception(arg)` like for every other type of argument.

This comes from from CPython's `PyErr_SetObject` which ultimately calls
`_PyErr_CreateException` where the "culprit" is found here:
https://github.com/python/cpython/blob/main/Python/errors.c#L33

We can fix this particular bug in the invocation of `PyErr::new` but it
is a more general question if we want to keep reflecting this somewhat
surprising CPython behavior, or create a better API, introducing a
breaking change.
@LilyFoote
Copy link
Contributor

I think the CPython behaviour is a footgun, so I'd lean towards implementing a better API in PyO3.

@LilyFoote LilyFoote added this pull request to the merge queue Aug 1, 2024
Merged via the queue into PyO3:main with commit ef0f544 Aug 1, 2024
40 of 42 checks passed
davidhewitt pushed a commit that referenced this pull request Sep 3, 2024
Fixes #4400

As the return value is ultimately communicated back via a StopIteration
exception instance, a peculiar behavior of `PyErr::new` is encountered
here: when the argument is a tuple `arg`, it is used to construct the
exception as if calling from Python `Exception(*arg)` and not
`Exception(arg)` like for every other type of argument.

This comes from from CPython's `PyErr_SetObject` which ultimately calls
`_PyErr_CreateException` where the "culprit" is found here:
https://github.com/python/cpython/blob/main/Python/errors.c#L33

We can fix this particular bug in the invocation of `PyErr::new` but it
is a more general question if we want to keep reflecting this somewhat
surprising CPython behavior, or create a better API, introducing a
breaking change.
davidhewitt pushed a commit that referenced this pull request Sep 3, 2024
Fixes #4400

As the return value is ultimately communicated back via a StopIteration
exception instance, a peculiar behavior of `PyErr::new` is encountered
here: when the argument is a tuple `arg`, it is used to construct the
exception as if calling from Python `Exception(*arg)` and not
`Exception(arg)` like for every other type of argument.

This comes from from CPython's `PyErr_SetObject` which ultimately calls
`_PyErr_CreateException` where the "culprit" is found here:
https://github.com/python/cpython/blob/main/Python/errors.c#L33

We can fix this particular bug in the invocation of `PyErr::new` but it
is a more general question if we want to keep reflecting this somewhat
surprising CPython behavior, or create a better API, introducing a
breaking change.
davidhewitt pushed a commit that referenced this pull request Sep 15, 2024
Fixes #4400

As the return value is ultimately communicated back via a StopIteration
exception instance, a peculiar behavior of `PyErr::new` is encountered
here: when the argument is a tuple `arg`, it is used to construct the
exception as if calling from Python `Exception(*arg)` and not
`Exception(arg)` like for every other type of argument.

This comes from from CPython's `PyErr_SetObject` which ultimately calls
`_PyErr_CreateException` where the "culprit" is found here:
https://github.com/python/cpython/blob/main/Python/errors.c#L33

We can fix this particular bug in the invocation of `PyErr::new` but it
is a more general question if we want to keep reflecting this somewhat
surprising CPython behavior, or create a better API, introducing a
breaking change.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Can't return a tuple from async function
2 participants