Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I really like the design of
PyClassInitializer
proposed in PyO3#683.However, in the form proposed, I think
IntoInitializer
is doing too much. It's handling both what is allowed to return from#[new]
as well as allowing those types to be optionally wrapped inPyResult
.This means that the use of
IntoInitializer
inPy<T>::new
can also acceptPyResult<T>
as the input, which seems too generous to me. e.g. this will compile:Py::new(py, Ok(42))
This also leads to other strange API usages such as
I propose to simplify
IntoInitializer
to keep the conversion space smaller:IntoInitializer
Into
as much as possiblederive_utils
traitIntoPyNewResult
to deal with the optional wrapping inPyResult
for the macro code.With these changes, all functionality for
#[new]
remains intact. The coupling betweenIntoInitializer
andPyResult
would be removed, making the API neater.