uso dinâmico de um método de classe definida em um módulo de extensão Cython
Pergunta
Gostaria de usar a implementação C de um método de classe (gerado a partir Cython ) se for presente, ou usar o seu equivalente Python se a extensão de C não está presente. A primeira vez que tentei isso:
class A(object):
try:
import c_ext
method = c_ext.optimized_method
except ImportError:
def method(self):
return "foo"
Onde optimized_method é uma função definida em um Cython módulo:
def optimized_method(self):
return "fasterfoo"
Mas isso não funciona:
>>> A().method()
exceptions.TypeError: optimized_method() takes exactly one argument (0 given)
A única maneira que eu encontrei para fazer este trabalho é:
class A(object):
def method(self):
try:
import c_ext
return c_ext.optimized_method(self)
except ImportError:
pass
return "foo"
Mas a verificação de presença do módulo em cada chamada de função parece bastante abaixo do ideal ... Por que não é a minha primeira abordagem de trabalho?
[editar]: adicionado Cython do módulo conteúdos
Solução
Ok eu só encontrei a resposta ...
O problema vem da maneira Cython envoltórios as funções de TI exportações : cada método é não ligado, independentemente de onde ele é referenciado
.A solução é declarar expressamente um método ligado:
class A(object):
def method(self):
return "foo"
try:
import c_ext
import types
A.method = types.MethodType(c_ext.optimized_method, None, A)
except ImportError:
pass