Как передать функцию Python функции Python, которая принимает функцию в качестве параметра? - PullRequest
0 голосов
/ 06 декабря 2018

Я перефразирую свой оригинальный вопрос , основываясь на некоторых комментариях (я понял, что когда он был опубликован, вопрос был не так точен, как мог бы быть) в надежде найти ответ.

У меня есть следующая функция cdef , которая среди различных других параметров принимает функцию f () , определенную как ftype , как показанониже

%%cython
ctypedef double (*ftype) (double)

cdef cy_myfunc(int a,..., double x, ftype f):
  ...
  cdef double result
  result = f(x)
  return result

и я определяю функцию python, например:

def py_myfunc(a,..., x, f):
    return cy_myfunc(a,...,x,f)

Я хочу иметь возможность вызвать py_myfunc () и передать пользователяФункция Python в качестве параметра f (единственной предпосылкой функции Python является то, что она должна принимать double и возвращать double).Это возможно?если так, как это может быть достигнуто в Cython?Функция f () многократно используется в цикле, поэтому я бы хотел, чтобы она была максимально быстрой.

1 Ответ

0 голосов
/ 06 декабря 2018

Я давно не возился с цифоном.Но концептуально ваш подход несовершенен.За счет жесткого кодирования функции типа C, которая может быть только простым значением указателя, вы слишком сильно ограничивали себя.Функция Python никогда не может быть такой.Он ВСЕГДА будет представлен Py_Object, как любой вызываемый объект.

Просто не объявляйте f как тип f, а вместо этого обычный объект python (или вообще без типа), итогда просто позвони.В любом случае вам нужна полная семантика переданного Py_Object *, поскольку у cython нет способа гарантировать, что переданная функция не будет полностью отличаться от вызываемой.

...