2010-11-20 8 views
20

私はPython2.xコードベースでStringTypeとNoneType(型モジュール)を使用するコードベースを持っています。 Python3への移植では、Python3.xのtypesモジュールに上記の2つの型がないため、テストは失敗しました。python3.xのStringTypeとNoneType

"str"と "None"にそれぞれ置き換えて問題を解決しました。私はこれを行う別の(正しい)方法があるのだろうかと思っていた。私が現在やっていることは間違いなく効いているようですが、疑わしいです。

私が行ったアプローチに従うべきか、私がやったことに何か間違いがありますか?もしそうなら、私はそれをどのように修正するのですか?

答えて

19

チェックなし通常はobj is Noneを呼び出して、文字列を確認するのは通常isinstance(obj, str)です。文字列とUnicodeの両方を検出するPython 2.xでは、isinstance(obj, basestring)を使用できます。

あなたが2to3を使用している場合、それは十分ですが、あなたはPY2とPY3の両方で動作するコードの一片を持っている必要がある場合、あなたはそのようなことになってしまうことがあります。

私が推薦する可能
try: 
    return isinstance(obj, basestring) 
except NameError: 
    return isinstance(obj, str) 
+2

あなたは正しいが、一般的に2to3は 'を通過するコードを作成することをお勧めします'正しくすべての状況に対処するコードの1つのロットを作るよりも。 'isinstance(obj、basestring)'だけを使うと、 '2to3'は' isinstance(obj、str) 'に変更します。 –

+0

ああ、私は2to3について考えていませんでした - 私はちょうどそれらの両方で動作するように要求された小さなライブラリを書きました。私は私の答えを修正します。 –

4

その値が明らかな場合はtypesの値を避けるようにしてください。オブジェクトにメソッドをバインドするなどの場合は、 (str, unicode)またはbasestringを使用してください。types.MethodTypeを使用してください。

このような状況のために、私はこれを行うだろう:

  • 使用obj is Noneまたはobj is not Noneではなくisinstance(obj, NoneType)またはnot isinstance(obj, NoneType)
  • 使用後isinstance(obj, basestring)ではなくisinstance(obj, StringTypes)
  • 使用isinstance(obj, str)ではなくisinstance(obj, StringType)

、あなたが2to3を使用し、Pythonの3のために配布する必要がしています。その後、basestringstrになり、残りの部分はこれまでと同じように動作します。

(また、心に留めて、この、StringTypeStringTypes間の特定の違い:

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

関連する問題