2010-11-20 6 views
20

Ich habe eine Codebasis, die StringType und NoneType (Typen Modul) in der Codebasis Python2.x verwendet. Bei der Portierung auf Python3 sind Tests fehlgeschlagen, da das Modul types in Python3.x nicht die oben genannten zwei Typen aufweist.StringType und NoneType in python3.x

Ich löste das Problem, indem Sie sie jeweils durch "str" ​​und "None" ersetzt. Ich habe mich gefragt, ob es einen anderen (richtigen) Weg gibt, dies zu tun. Was ich momentan mache, scheint definitiv zu funktionieren, aber ich bin zweifelhaft.

Sollte ich mich an den Ansatz halten, dem ich gefolgt bin, oder stimmt etwas nicht mit dem, was ich getan habe? Wenn ja, wie korrigiere ich es?

Antwort

19

Die Überprüfung von None erfolgt normalerweise durch Aufruf von obj is None, während die Suche nach Zeichenketten normalerweise isinstance(obj, str) ist. In Python 2.x, um sowohl Zeichenfolge als auch Unicode zu erkennen, könnten Sie isinstance(obj, basestring) verwenden.

Wenn Sie 2to3 verwenden, es ist genug, aber wenn Sie einzelnes Stück Code benötigen, um in beiden Py2 und PY3 arbeiten, können Sie mit so etwas können am Ende:

try: 
    return isinstance(obj, basestring) 
except NameError: 
    return isinstance(obj, str) 
+2

Du hast Recht, aber es ist im Allgemeinen zu machen Code empfohlen, die durch '2to3 passieren "richtig, anstatt die eine Menge Code mit allen Situationen umzugehen. Wenn Sie nur 'isinstance (obj, basestring)' verwenden, ändert '2to3' es in' isinstance (obj, str) '. –

+0

Ah, ok, ich hatte keine Ahnung von 2to3 - ich habe nur einmal eine kleine Bibliothek geschrieben, die in beiden benötigt wurde. Ich werde meine Antwort reparieren. –

4

Wo möglich, würde ich empfehlen, dass Sie die Werte in types vermeiden, wenn ihre Werte offensichtlich sind; Für etwas wie das Binden einer Methode an ein Objekt verwenden Sie types.MethodType, aber für types.StringTypes verwenden Sie (str, unicode) oder besser basestring.

Für diese Situation, würde ich dies tun:

  • Verwenden obj is None oder obj is not None statt isinstance(obj, NoneType) oder not isinstance(obj, NoneType).
  • Verwenden isinstance(obj, basestring) statt isinstance(obj, StringTypes)
  • Verwenden isinstance(obj, str) statt isinstance(obj, StringType)

Dann, wenn Sie für Python 3 2to3 verwenden zu verteilen sind zu benötigen. Dann wird basestring zu str und der Rest wird weiterhin so funktionieren wie zuvor.

(auch bedenken, dies insbesondere den Unterschied zwischen StringType und StringTypes:

types.UnicodeType == unicode 
types.StringType == str 
types.StringTypes == (str, unicode) 

)