182

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"

4

10 に答える 10

216

2.x および 3.x 互換のコードを作成している場合は、おそらくsixを使用することをお勧めします。

from six import string_types
isinstance(s, string_types)
于 2012-07-02T21:23:46.460 に答える
19

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

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

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

編集: 実際には、呼び出す必要さえありません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()ます。

于 2012-07-02T22:01:44.517 に答える
8

多分次のような回避策を使用してください

def isstr(s):
    try:
        return isinstance(s, basestring)
    except NameError:
        return isinstance(s, str)
于 2012-07-02T21:09:39.580 に答える
8

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

    isinstance(object,"".__class__)

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

    from __future__ import unicode_literals
于 2013-02-28T05:35:08.730 に答える
1

気をつけて!Python 2 では、strbytesは本質的に同じです。この 2 つを区別しようとすると、バグが発生する可能性があります。

>>> size = 5    
>>> byte_arr = bytes(size)
>>> isinstance(byte_arr, bytes)
True
>>> isinstance(byte_arr, str)
True
于 2019-10-07T23:05:41.897 に答える
-5

タイプ(文字列) == 文字列

文字列の場合は true、そうでない場合は false を返します

于 2016-06-08T18:42:34.900 に答える