Merge pull request #2213 from PyO3/guide_new_fix

guide: fix duplicated example for #[new]
This commit is contained in:
David Hewitt 2022-03-06 10:18:07 +00:00 committed by GitHub
commit ecfc4a10d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 12 additions and 4 deletions

View File

@ -78,18 +78,26 @@ Alternatively, if your `new` method may fail you can return `PyResult<Self>`.
```rust
# use pyo3::prelude::*;
# use pyo3::exceptions::PyValueError;
# #[pyclass]
# struct Number(i32);
# struct Nonzero(i32);
#
#[pymethods]
impl Number {
impl Nonzero {
#[new]
fn new(value: i32) -> Self {
Number(value)
fn py_new(value: i32) -> PyResult<Self> {
if value == 0 {
Err(PyValueError::new_err("cannot be zero"))
} else {
Ok(Nonzero(value))
}
}
}
```
As you can see, the Rust method name is not important here; this way you can
still use `new()` for a Rust-level constructor.
If no method marked with `#[new]` is declared, object instances can only be
created from Rust, but not from Python.