web-dev-qa-db-ja.com

isinstance( 'aaa'、basestring)とisinstance( 'aaa'、str)の違いは何ですか?

a='aaaa'
print isinstance(a, basestring)#true
print isinstance(a, str)#true
154
zjm1126

3.0より前のPythonバージョンには、2種類の文字列「プレーン文字列」と「ユニコード文字列」があります。プレーン文字列(str)は、ラテンアルファベット以外の文字を表すことはできません(簡単にするためにコードページの詳細を無視します)。 Unicode文字列(unicode)は、Klingonなどの架空のものを含む、任意のアルファベットの文字を表すことができます。

では、なぜ2種類の文字列があるのでしょうか。すべてのケースをカバーするので、Unicodeを使用する方が良いでしょうか?ユニコードのみを使用する方が適切ですが、ユニコードが文字列の表現方法として推奨される前にPythonが作成されました。多くのユーザーがいる言語で文字列型を移行するには時間がかかります。Python 3.0では、最終的にすべての文字列がUnicodeになります。

3.0より前のPython文字列の継承階層は次のとおりです。

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

Python 2.3で導入された 'basestring'は、オブジェクトがstrまたはunicodeのインスタンスであるかどうかを確認するために使用できるため、文字列統合の方向へのステップと考えることができます。

>>> string1 = "I am a plain string"
>>> string2 = u"I am a unicode string"
>>> isinstance(string1, str)
True
>>> isinstance(string2, str)
False
>>> isinstance(string1, unicode)
False
>>> isinstance(string2, unicode)
True
>>> isinstance(string1, basestring)
True
>>> isinstance(string2, basestring)
True
374
Tendayi Mawushe

すべての文字列はベース文字列ですが、Unicode文字列はstr型ではありません。代わりにこれを試してください:

>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
8
Mark Byers

実際に求めているのは、basestringクラスとstrクラスの違いです。

Strは、basestrを継承するクラスです。ただし、他の文字列を作成する場合は、Unicode文字列も存在します。

>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
4
McPherrinM

Basestringは、stringのスーパークラスです。あなたの例では、aは「str」型であり、したがって、ベースストリングとstrの両方です

1
Alan