7

In Python werden normalerweise Funktionen wie str(), int(), float() usw. zum Ausführen von Typkonvertierungen verwendet. Diese erfordern jedoch, dass Sie zur Entwicklungszeit wissen, in welchen Typ Sie konvertieren möchten. Ein Teilproblem von etwas Python-Code, den ich versuche zu schreiben, ist wie folgt:Python-Reflexion und Typkonvertierung

Gegeben zwei Variablen, foo und bar, finden Sie den Typ foo. (Es ist zur Entwicklungszeit nicht bekannt, da dies generischer Code ist.) Versuchen Sie dann, bar in den Typ foo zu konvertieren. Wenn dies nicht möglich ist, werfen Sie eine Ausnahme aus.

Nehmen wir zum Beispiel an, Sie rufen die Funktion, die dies tut conv. Seine Unterschrift würde aussehen wie

def conv(foo, bar) : 
    # Do stuff. 

es so etwas wie nennen würde:

result = conv(3.14, "2.718") # result is now 2.718, as a float. 

Antwort

11

Verwenden foo.__class__ die Art der foo zu bekommen. Dann rufen sie bar auf die Art der foo zu konvertieren:

def conv(foo, bar) : 
    return foo.__class__(bar) 

Natürlich funktioniert dies nur, wenn die Art der foo einen Konstruktor hat, der weiß, wie man bar konvertieren.

+0

Beeindruckend. Ich hätte nie gedacht, dass es so unglaublich einfach wäre. Auch überraschend (ich bin neu in Python und gewohnt, näher an den Metallsprachen) ist, dass es mit Builtins funktioniert. – dsimcha

+0

Teilweise falsch. foo .__ class__ ist nur der Typ von foo, wenn foo ein neues Objekt ist. Ansonsten ist es nur die Klasse. –

+0

Nur falsch insofern, als ich "type" sagte, wenn Klasse genauer wäre. Aber er braucht die Klasse für diese Konvertierung. Und in Python 3 ist der Unterschied sowieso weg. – oefe

16

, die am besten sein würde:

type(foo)(bar) 
+0

Nur in Python 3.0. In Python 2.x funktioniert dies nur für "new-style classes" und "builtins". – oefe

0
type(foo) 

ist definitiv das beste, wenn Sie eine Art überprüfen wollen, dann „Typ“ ist die beste Methode, und ich bin auf python 2.7 - 3.2.2, type() funktioniert perfekt.