web-dev-qa-db-ja.com

変数がpython 2と3の互換性を持つ文字列かどうかを確認する方法

Python-3.xでisinstance(x, str)を使用できることは承知していますが、python-2.xでも文字列かどうかを確認する必要があります。 isinstance(x, str)はpython-2.xで期待どおりに機能しますか?または、バージョンを確認してisinstance(x, basestr)を使用する必要がありますか?

具体的には、python-2.xの場合:

>>>isinstance(u"test", str)
False

python-3.xにはu"foo"がありません

158
Randall Hunt

2.x-and-3.x互換のコードを書いている場合は、おそらく six を使用する必要があります。

from six import string_types
isinstance(s, string_types)
187
ecatmur

6つのようなパッケージに依存せずに見つけた最も簡潔なアプローチは次のとおりです。

try:
  basestring
except NameError:
  basestring = str

次に、Python 2の文字列を最も一般的な方法でチェックしていると仮定すると、

isinstance(s, basestring)

Python 3+でも機能するようになりました。

107
hbristow

これはどうですか、すべてのケースで動作しますか?

isinstance(x, ("".__class__, u"".__class__))
30
Fil

これは@Lev Levitskyの回答で、少し書き直されています。

try:
    isinstance("", basestring)
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

try/exceptテストは1回実行され、常に機能し、可能な限り高速な関数を定義します。

編集:実際には、isinstance()を呼び出す必要さえありません。 basestringを評価し、NameErrorを取得するかどうかを確認するだけです。

try:
    basestring  # attempt to evaluate basestring
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

ただし、isinstance()を呼び出す方が簡単だと思います。

17
steveha

future library は(Python 2に)互換性のある名前を追加するので、書き込みを続行Python 3。以下を簡単に実行できます。

from builtins import str
isinstance(x, str) 

それをインストールするには、単にpip install futureを実行します。

caveatとして、python>=2.6>=3.3のみをサポートしますが、それはsixよりも最新です python 2.5を使用する場合に推奨

10
toto_tico

たぶん次のような回避策を使用してください

def isstr(s):
    try:
        return isinstance(s, basestring)
    except NameError:
        return isinstance(s, str)
8
Lev Levitsky

object.__class__を呼び出すことでオブジェクトのクラスを取得できます。そのため、オブジェクトがデフォルトの文字列型であるかどうかを確認するには:

    isinstance(object,"".__class__)

また、引用符で囲まれた文字列がpython 2のUnicodeになるように、次のコードをコードの先頭に配置できます。

    from __future__ import unicode_literals
6
Martin Hansen

コードの冒頭でこれを試すことができます:

from __future__ import print_function
import sys
if sys.version[0] == "2":
    py3 = False
else:
    py3 = True
if py3: 
    basstring = str
else:
    basstring = basestring

以降のコード:

anystring = "test"
# anystring = 1
if isinstance(anystring, basstring):
    print("This is a string")
else:
    print("No string")
0
bunkus