2017-04-04 1 views
1

Ich habe zwei Dateien: eine run.py und eine constraints.pyx. Ich möchte eine Extension-Klasse ähnlich zu L1Penalty in this code, in constraints.pyx, und instanziieren Sie es in run.py in einer Funktion verwendet werdenImportieren von Cython Extension Class in Python-Datei (Positionsargument

Was ich getan habe.

constraints.pyx eine Erweiterung Klasse enthält, eine Unterklasse der Penalty-Klasse in this code:

from lightning.impl.sag_fast cimport Penalty 

cdef class ProbaPenalty(Penalty): 
    def __cinit__(self): 
     self.support_lagged = False 
... 

im Laufe .py Ich erstelle eine Instanz von ProbaPenalty:

import pyximport; pyximport.install() 
from constraints import ProbaPenalty 
pen = ProbaPenalty() 

Der Fehler, die ich habe ist:

cinit() takes exactly 1 positional argument (0 given)

Gibt es einen Flüchtigkeitsfehler? Ich kann ein ähnliches Problem bei Stackoverflow nicht finden. Ich habe versucht, meine CINIT Wechsel in einem bint zu nehmen support_lagged so, dass ich

cdef class ProbaPenalty(Penalty): 
    def __cinit__(self, bint support_lagged): 
     self.support_lagged = support_lagged 

haben jetzt Und dann

pen = ProbaPenalty(0) 

Dieses Mal verwenden, erhalte ich die Fehlermeldung:

AttributeError: 'custom_constraints.ProbaPenalty' object has no attribute 'b'

Wo habe ich b angerufen, und woher kommt b überhaupt?

Am Anfang wollte ich ProbaPenalty einen Vektor von doubles b haben, und ich habe cinit (self, double * b), aber ich habe seitdem den Code geändert, löschte die .c und .so-Dateien usw. Wenn Sie in die aktuelle .c-Datei schauen, gibt es auch kein Attribut b.

Ich habe auch versucht, mit einem Setup.py, mit dem gleichen Problem zu kompilieren.

+0

Basierend auf OPs Kommentar unter der Antwort Ich stimme zu schließen, wie "kann nicht reproduziert werden" – DavidW

Antwort

0

__cinit__ Die Methode ist nicht geeignet für Python-Level-Zugriff auf die Erweiterungstypen finden http://docs.cython.org/en/latest/src/reference/extension_types.html

eine reguar definieren __init__ zur Verwendung von Python.

+0

Ich versuchte tatsächlich laufen, was ich heute Morgen wieder hatte, nach dem Schließen und wieder öffnen Spyder - es funktioniert sogar mit __cinit__. In jedem Fall hätte es nicht erklärt, warum es ein Attribut b gab. Ich denke, es wurden irgendwie Variablen gespeichert, die nicht gelöscht wurden, als ich meine setup.py erneut ausgeführt habe. –

Verwandte Themen