Utilisation dynamique d'une méthode de classe définie dans un module d'extension Cython

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

  •  05-09-2019
  •  | 
  •  

Question

Je voudrais utiliser l'implémentation C d'une méthode de classe (générée à partir de Cython ) si elle est présente, ou son équivalent python si l'extension de C est absent. J'ai d'abord essayé ceci:

class A(object):
    try:
        import c_ext
        method = c_ext.optimized_method
    except ImportError:
        def method(self):
            return "foo"

Où optimized_method est une fonction définie dans un Cython le module:

def optimized_method(self):
    return "fasterfoo"

Mais cela ne fonctionne pas:

>>> A().method()
exceptions.TypeError: optimized_method() takes exactly one argument (0 given)

La seule manière que je trouvais pour faire ce travail est:

class A(object):
    def method(self):
        try:
            import c_ext
            return c_ext.optimized_method(self)
        except ImportError:
            pass
        return "foo"

Mais la vérification de la présence à chaque appel de fonction du module semble tout à fait ... Pourquoi suboptimale pas mon premier approche fonctionne?

[modifier]: Cython contenu du module

Était-ce utile?

La solution

Ok je viens de trouver la réponse ...

Le problème vient de la façon Cython enveloppe les fonctions qu'il les exportations : chaque méthode est non liée indépendamment de l'endroit où il est référencé

.

La solution consiste à déclarer explicitement un procédé lié:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top