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"
がありません
2.x-and-3.x互換のコードを書いている場合は、おそらく six を使用する必要があります。
from six import string_types
isinstance(s, string_types)
6つのようなパッケージに依存せずに見つけた最も簡潔なアプローチは次のとおりです。
try:
basestring
except NameError:
basestring = str
次に、Python 2の文字列を最も一般的な方法でチェックしていると仮定すると、
isinstance(s, basestring)
Python 3+でも機能するようになりました。
これはどうですか、すべてのケースで動作しますか?
isinstance(x, ("".__class__, u"".__class__))
これは@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()
を呼び出す方が簡単だと思います。
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
を使用する場合に推奨
たぶん次のような回避策を使用してください
def isstr(s):
try:
return isinstance(s, basestring)
except NameError:
return isinstance(s, str)
object.__class__
を呼び出すことでオブジェクトのクラスを取得できます。そのため、オブジェクトがデフォルトの文字列型であるかどうかを確認するには:
isinstance(object,"".__class__)
また、引用符で囲まれた文字列がpython 2のUnicodeになるように、次のコードをコードの先頭に配置できます。
from __future__ import unicode_literals
コードの冒頭でこれを試すことができます:
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")