Skip to content

Commit 016eb7a

Browse files
committed
doctests
1 parent 2de7072 commit 016eb7a

File tree

1 file changed

+33
-15
lines changed

1 file changed

+33
-15
lines changed

src/random.rs

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,44 @@
44
//! you can generate random numbers without holding the GIL,
55
//! by [acquiring][`PyBitGeneratorMethods::lock`] a lock [guard][`PyBitGeneratorGuard`] for the [`PyBitGenerator`]:
66
//!
7-
//! ```rust
7+
//! ```
88
//! use pyo3::prelude::*;
99
//! use numpy::random::{PyBitGenerator, PyBitGeneratorMethods as _};
1010
//!
11-
//! let mut bitgen = Python::with_gil(|py| -> PyResult<_> {
11+
//! fn default_bit_gen<'py>(py: Python<'py>) -> PyResult<Bound<'py, PyBitGenerator>> {
1212
//! let default_rng = py.import("numpy.random")?.call_method0("default_rng")?;
13-
//! let bit_generator = default_rng.getattr("bit_generator")?.downcast_into::<PyBitGenerator>()?;
14-
//! bit_generator.lock()
13+
//! let bit_generator = default_rng.getattr("bit_generator")?.downcast_into()?;
14+
//! Ok(bit_generator)
15+
//! }
16+
//!
17+
//! let random_number = Python::with_gil(|py| -> PyResult<_> {
18+
//! let mut bitgen = default_bit_gen(py)?.lock()?;
19+
//! Ok(bitgen.next_uint64())
1520
//! })?;
16-
//! let random_number = bitgen.next_u64();
21+
//! # Ok::<(), PyErr>(())
1722
//! ```
1823
//!
1924
//! With the [`rand`] crate installed, you can also use the [`rand::Rng`] APIs from the [`PyBitGeneratorGuard`]:
2025
//!
21-
//! ```rust
26+
//! ```
27+
//! use pyo3::prelude::*;
2228
//! use rand::Rng as _;
29+
//! use numpy::random::{PyBitGenerator, PyBitGeneratorMethods as _};
30+
//! # // TODO: reuse function definition from above?
31+
//! # fn default_bit_gen<'py>(py: Python<'py>) -> PyResult<Bound<'py, PyBitGenerator>> {
32+
//! # let default_rng = py.import("numpy.random")?.call_method0("default_rng")?;
33+
//! # let bit_generator = default_rng.getattr("bit_generator")?.downcast_into()?;
34+
//! # Ok(bit_generator)
35+
//! # }
2336
//!
24-
//! if bitgen.random_ratio(1, 1_000_000) {
25-
//! println!("a sure thing");
26-
//! }
37+
//! Python::with_gil(|py| -> PyResult<_> {
38+
//! let mut bitgen = default_bit_gen(py)?.lock()?;
39+
//! if bitgen.random_ratio(1, 1_000_000) {
40+
//! println!("a sure thing");
41+
//! }
42+
//! Ok(())
43+
//! })?;
44+
//! # Ok::<(), PyErr>(())
2745
//! ```
2846
//!
2947
//! [bg]: https://numpy.org/doc/stable//reference/random/bit_generators/generated/numpy.random.BitGenerator.html
@@ -99,7 +117,7 @@ impl<'py> PyBitGeneratorMethods<'py> for Bound<'py, PyBitGenerator> {
99117
};
100118
Ok(PyBitGeneratorGuard {
101119
raw_bitgen: non_null,
102-
capsule,
120+
_capsule: capsule,
103121
lock,
104122
})
105123
}
@@ -115,7 +133,7 @@ impl<'py> TryFrom<&Bound<'py, PyBitGenerator>> for PyBitGeneratorGuard<'py> {
115133
/// [`PyBitGenerator`] lock allowing to access its methods without holding the GIL.
116134
pub struct PyBitGeneratorGuard<'py> {
117135
raw_bitgen: NonNull<npy_bitgen>,
118-
capsule: Bound<'py, PyCapsule>,
136+
_capsule: Bound<'py, PyCapsule>,
119137
lock: Bound<'py, PyAny>,
120138
}
121139

@@ -140,28 +158,28 @@ impl PyBitGeneratorGuard<'_> {
140158
/// Returns the next random unsigned 64 bit integer.
141159
pub fn next_uint64(&mut self) -> u64 {
142160
unsafe {
143-
let bitgen = self.raw_bitgen.as_mut();
161+
let bitgen = *self.raw_bitgen.as_ptr();
144162
(bitgen.next_uint64)(bitgen.state)
145163
}
146164
}
147165
/// Returns the next random unsigned 32 bit integer.
148166
pub fn next_uint32(&mut self) -> u32 {
149167
unsafe {
150-
let bitgen = self.raw_bitgen.as_mut();
168+
let bitgen = *self.raw_bitgen.as_ptr();
151169
(bitgen.next_uint32)(bitgen.state)
152170
}
153171
}
154172
/// Returns the next random double.
155173
pub fn next_double(&mut self) -> libc::c_double {
156174
unsafe {
157-
let bitgen = self.raw_bitgen.as_mut();
175+
let bitgen = *self.raw_bitgen.as_ptr();
158176
(bitgen.next_double)(bitgen.state)
159177
}
160178
}
161179
/// Returns the next raw value (can be used for testing).
162180
pub fn next_raw(&mut self) -> u64 {
163181
unsafe {
164-
let bitgen = self.raw_bitgen.as_mut();
182+
let bitgen = *self.raw_bitgen.as_ptr();
165183
(bitgen.next_raw)(bitgen.state)
166184
}
167185
}

0 commit comments

Comments
 (0)