В Pybind11, как вы тестируете, является ли объект Py :: Coverse Complex или Callable?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 В Pybind11, как вы тестируете, является ли объект Py :: Coverse Complex или Callable?

Сообщение Anonymous »

Контекст: Я недавно использовал Pybind11, чтобы поместить интерфейс Python на старый проект C ++. В основном это был бризом (спасибо Pybind11 Devs!), Но есть некоторые области, где мне приходилось прибегать к некоторым действительно уродливым взломам, которых я бы предпочел избежать. Это тривиально для Int, Float, String, List и т. Д., Но я не вижу очевидного способа для сложных чисел и ручек функций. Вот мой текущий обходной путь для сложных чисел: < /p>

Код: Выделить всё

bool isComplex(py::object src)
{
// put src into a buffer accessible from both C++ and python (i is an index in this buffer)
int i = pyosetsrc(src);

// Build a python function to do the "is it complex" test
std::string fn;
fn = "isinstance(mycode.pyogetsrc("; // pyogetsrc(i) gets src back out of the shared buffer
fn += std::to_string(i);
fn += "), complex)";

// Wrap this in an eval statement
std::string evalfn;
evalfn = "eval('";
evalfn += fn;
evalfn += "')";

// Run the eval statement
py::object builtins = py::module_::import("builtins");
py::object eval = builtins.attr("eval");
py::object res = eval(evalfn);

// Process the result
return py::isinstance
(res) && py::cast(res);
}
< /code>
и для обработки функций есть аналогичный взлом, на этот раз с: < /p>
    fn = "callable(mycode.pyogetsrc(";
fn += std::to_string(i);
fn += "))";
Есть ли менее ужасная альтернатива, которую я здесь не хватает?


Подробнее здесь: https://stackoverflow.com/questions/796 ... a-callable
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»