Skip to main content

pyo3 Troubles with `inspect.signature` method

I have a rust struct with which I had implemented python's magic methods __iter__, __next__, and __call__.

#[pyclass(name = "PyNRICContainer")]
#[derive(Debug)]
#[pyo3(text_signature = "(cls, value, values)")]
pub struct PyNRICContainer {
    #[pyo3(get, set)]
    boolean: bool,
}

Here are the implementations:

#[pymethods]
impl PyNRICContainer {

    #[new]
    #[pyo3(signature = "(cls, value, values)")]
    fn new() -> PyResult<PyNRICContainer> {
        Ok(PyNRICContainer { boolean: true })
    }

    fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> {
        slf
    }

    fn __next__(mut slf: PyRefMut<'_, Self>) -> IterNextOutput<PyRefMut<'_, Self>, &'static str> {
        if slf.boolean {
            slf.boolean = false;
            IterNextOutput::Yield(slf)
        } else {
            IterNextOutput::Return("No Longer Iterable.")
        }
    }


    #[classmethod]
    fn __call__(&mut self, py: Python<'_>, value: &PyString, values: Option<&PyDict>) -> PyResult<PyNRIC> {
        let v: String = value.extract()?;
        PyNRIC::new(v)
    }
    
}

With this, I enabled the behavior of yield this object through the following python codes.

g = PyNRICContainer()
gs = (
      *(g if g else ()),
  )
  print("gs", gs)

The output of the above snippet is:

gs (<builtins.PyNRICContainer object at 0x0000021250B37650>,)

Now, as inspect.signature method cannot get a signature out of g in the above snippet, it raises a ValueError shown below.

ValueError: callable <builtins.PyNRICContainer object at 0x0000021250B37650> is not supported by signature

In the pyo3's documentations, there is a mention of the macro #[pyo3(text_signature)], I tried to implement it above the fn __call__ but it couldn't compile as:

error: `text_signature` cannot be used with `__call__`

My objective is to have a python callable object which is also 'yieldable', i.e. I should be able to yield the object, e.g. yield g in a function or using to * operator to unpack the function from which g was yielded.

E.g.

def yield_g():
    yield g

gs = (
    *(yield_g() if yield_g else None),
)

And it should output something like (g,). I have also tried printing type(g).text_signature but it gives an AttributeError.

Is it possible to make a pyo3::types::PyFunction a PyIterator such that it is yieldable?



source https://stackoverflow.com/questions/75574260/pyo3-troubles-with-inspect-signature-method

Comments

Popular posts from this blog

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console...

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

The number of nodes and edges I calculated manually and by a method provided by networkx library dont match

I am trying to analyse a graph using networkx library in Python. I have implemented a function that returns the nodes and edges of that graph. After that I counted the number of nodes and edges by implementing the len() function for nodes and edges, which gave me 17 for both nodes and edges. However, when I used the method graph.number_of_nodes() of networkx library it gave me 53. My code: import pandas as pd import networkx as nx import matplotlib.pyplot as plt header_list = ["a","b","w"] E =pd.read_csv("aves-barn-swallow-contact-network.edges",sep=" ",header= None,names=header_list) # print(E.head()) # prints first few rows of the csv file G = nx.from_pandas_edgelist(E,"a","b",["w"]) nx.draw(G) plt.show() class GraphAnalyse: #finding nodes and edges def nodeEdge(self,Graph): nodes = Graph.nodes() edges = Graph.edges() ...