pybind11: из c/c++ получить количество аргументов для функции python

В pybind11 у меня есть переменная типа pybind11::function. Есть ли способ определить, сколько аргументов принимает эта функция в С++? То есть, если это исходит от def f(a, b), ответ будет 2. Я понимаю, что это может сойти с ума с *arks, kwargs, self и т. д.

Чтобы было ясно, это внутри С++, поэтому я ищу код С++.


person Colin    schedule 03.07.2020    source источник


Ответы (2)


Вот как вы можете использовать inspect.signature():< /сильный>

from inspect import signature

import os # I only imported os to demonstrate with one of its functions

print(signature(os.remove)) # Print out the arguments for the remove fumction from the os module

Выход:

(path, *, dir_fd=None)
person Ann Zen    schedule 04.07.2020
comment
Наверное, я не совсем понял: внутри С++, где у меня есть переменная С++ типа pybind11::function. - person Colin; 04.07.2020
comment
привет @Колин. Вы можете запустить код Python, предложенный @Ann Zen, непосредственно из C++. См.: pybind11.readthedocs.io/en/stable/advanced/ . Таким образом, это будет вопрос получения len из signature - person Jean-Marc Volle; 05.07.2020

Итак, вот как это сделать в pybind11:

#include <pybind11/pybind11.h>
#include <pybind11/embed.h>
pybind11::function callback_; // from somewhere!
pybind11::module inspect_module = pybind11::module::import("inspect");
pybind11::object result = inspect_module.attr("signature")(callback_).attr("parameters");
auto num_params = pybind11::len(result);
// num_params is an int
person Colin    schedule 06.07.2020