uso dinâmico de um método de classe definida em um módulo de extensão Cython

StackOverflow https://stackoverflow.com/questions/725777

  •  05-09-2019
  •  | 
  •  

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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top