Wie gebe ich einer C ++ Klasse ein Python __repr __ () mit SWIG

8

Ich habe das beobachtet, wenn man

tippt %Vor%

in der Python repl, bekommt man

%Vor%

und wenn man

tippt %Vor%

man wird in den help Modus gekickt. Ich bin mir ziemlich sicher, dass dies so ist, weil site._Helper __repr__() (für das erste Beispiel) und __call__() (für das zweite) definiert.

Ich mag dieses Verhalten (Aufforderung nur für das Objekt und die aufrufbare Syntax), und ich möchte das Gleiche für eine C ++ - Klasse tun, die ich über SWIG nach Python exportiere. Hier ist ein einfaches Beispiel für das, was ich versucht habe zu tun

%Vor%

Wenn ich versuche, diese Klasse in meiner Anwendung zu verwenden, kann ich nicht das Verhalten sehen, das ich mit help sehe (die folgende Ausgabe stammt aus einer C ++ - Anwendung, in die jeweils Python eingebettet ist Eingabezeile wird über PyEval_String() ) gesendet:

%Vor%

Der letzte Druck zeigt, dass die Methode __repr__() vorhanden ist, aber ich kann sie nicht mit der einfacheren Objektreferenz oder mit repr(tam) finden. Ich habe auch versucht, __str()__ zu definieren, in der Hoffnung, dass ich falsch verstanden hätte, was man nennen würde, aber immer noch kein Glück.

Ich habe versucht, mit der Direktive %extend in der Schnittstellendatei die Definition __str__() oder __repr__() in die SWIG-Schnittstellendefinitionsdatei einzufügen, anstatt sie direkt in C ++ zu definieren, aber ohne Erfolg.

Was vermisse ich?

    
Don Wakefield 21.02.2013, 23:05
quelle

2 Antworten

3

Wie @flexo in einem Kommentar vorgeschlagen hat, wenn Sie das -builtin -Flag verwenden an den SWIG-Codegenerator ruft repr() Ihre __repr__ -Methode nicht auf. Stattdessen müssen Sie eine Funktion definieren, die in den Rep-Slot passt.

%Vor%

Laut HelpMimic :: printRepr muss eine Signatur vorhanden sein, die der erwarteten Signatur entspricht ( tp_repr in Python-Dokumenten ) - es muss ein String- oder Unicode-Objekt zurückgeben. Ein weiterer Vorbehalt - Sie können die gleiche Funktion nicht in mehr als einem Slot einsetzen, also versuchen Sie nicht, dies für tp_str zu verwenden!

    
dbn 02.06.2015 19:45
quelle
3

Normalerweise verwende ich die Funktion% extend, um zu vermeiden, dass C / C ++ für eine bestimmte Zielsprache zu sehr angepasst wird. ZB

%Vor%

Wo Sie innerhalb der Funktion replizieren sind, können Sie grundsätzlich jede Funktion aufrufen und die Ausgabe an Ihre Bedürfnisse anpassen. Außerdem können Sie Eigenschaften hinzufügen und definieren, wie sie Setter und Getter zugeordnet werden.

    
Jens Munk 11.08.2015 11:06
quelle

Tags und Links