web-dev-qa-db-ja.com

Pythonオブジェクトが文字列かどうかを調べる方法は?

Pythonオブジェクトが文字列(通常またはUnicode)かどうかをどうやって確認できますか?

351
Matt S.

Python 2

テスト対象オブジェクトobjにはisinstance(obj, basestring)を使用します。

ドキュメント

292
John Fouhy

オブジェクトoが文字列型のサブクラスの文字列型かどうかを調べるには、次のようにします。

isinstance(o, basestring)

なぜならstrunicodeはどちらもbasestringのサブクラスだからです。

oの型が正確にstrであるかどうかを確認するには、次のようにします。

type(o) is str

ostrのインスタンスまたはstrのサブクラスのいずれであるかを確認するには、次のようにします。

isinstance(o, str)

strunicodeに置き換えた場合、上記はUnicode文字列に対しても機能します。

ただし、明示的な型チェックをまったく行う必要はないかもしれません。 「ダックタイピング」はあなたのニーズに合うかもしれません。 http://docs.python.org/glossary.html#term-duck-typing を参照してください。

もご覧ください。pythonで型を確認するための標準的な方法は何ですか?

152
Matt S.

Python 3

Python 3.xでは、basestringが唯一の文字列型であるため(Python 2.xのstrのセマンティクスを使用)、unicodeは使用できなくなりました。

そのため、Python 3.xでの確認は以下のとおりです。

isinstance(obj_to_test, str)

これは、公式の2to3変換ツールの fix に続く:basestringstrに変換する。

130
sevenforce

Python 2と3

(クロス互換)

Pythonのバージョン(2.x vs 3.x)に関係なくチェックしたい場合は、 sixPyPI )およびそのstring_types属性

import six

if isinstance(obj, six.string_types):
    print('obj is a string!')

six(非常に軽量な単一ファイルモジュール)の中では、これは単に これをすることです

import sys
PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str
else:
    string_types = basestring
85
Nick T

私はこれをもっとPythonicで見つけました:

if type(aObject) is str:
    #do your stuff here
    pass

型オブジェクトはシングルトンなので、isを使用してオブジェクトとstr型を比較できます。

13
Zhou Jingyuan

明示的な型チェックを避けたい場合(およびはそれを避けたほうがよいの理由です)、チェックする文字列プロトコルの最も安全な部分は次のとおりです。

str(maybe_string) == maybe_string

それはイテレータやイテレータを介して反復することはありません、それは文字列のリストを呼び出すことはありませんし、それは正しく stringlike を正しく検出します。文字列.

もちろん欠点もあります。例えば、str(maybe_string)は重い計算になるかもしれません。よくあることだが、答えはである

11
clacke

あなたの変数があなたが好むものであるかどうかをチェックするために:

s='Hello World'
if isinstance(s,str):
#do something here,

Isistanceの出力にはブール値のTrueまたはFalseの値が表示されるので、それに応じて調整できます。最初に次のようにしてあなたの値の予想される頭字語をチェックすることができます。

11

他の人が言うように、私はアヒルタイプのスタイルでこれを扱うかもしれません。文字列が本当に文字列であることをどうやって知ることができますか?さて、明らかにそれを文字列に変換することによって!

def myfunc(Word):
    Word = unicode(Word)
    ...

引数がすでに文字列型またはUnicode型の場合、real_Wordはその値を変更せずにそのまま保持します。渡されたオブジェクトが__unicode__メソッドを実装している場合、それはそのUnicode表現を取得するために使用されます。渡されたオブジェクトが文字列として使用できない場合、unicode組み込み関数は例外を発生させます。

isinstance(your_object, basestring)

あなたのオブジェクトが本当に文字列型であればTrueになります。 'str'は予約語です。

私の謝罪、正しい答えはUnicode文字列を含めるためにも 'str'の代わりに 'basestring'を使用することです。

3
beepbeep

空の文字列と連結してテストできます。

def is_string(s):
  try:
    s += ''
  except:
    return False
  return True

編集

リストでこれが失敗すると指摘したコメントの後の私の答えを修正する

def is_string(s):
  return isinstance(s, basestring)
1
wisefish

今夜私は私が考えた状況に出くわしました私はstr型に対してチェックしなければならないつもりでした、しかしそれは私がしなかったことが判明しました。

この問題を解決するための私のアプローチはおそらく多くの状況でうまくいくでしょうから、この質問を読んでいる他の人が興味を持った場合に備えて、私は以下にそれを提供します(Python 3のみ)。

# NOTE: fields is an object that COULD be any number of things, including:
# - a single string-like object
# - a string-like object that needs to be converted to a sequence of 
# string-like objects at some separator, sep
# - a sequence of string-like objects
def getfields(*fields, sep=' ', validator=lambda f: True):
    '''Take a field sequence definition and yield from a validated
     field sequence. Accepts a string, a string with separators, 
     or a sequence of strings'''
    if fields:
        try:
            # single unpack in the case of a single argument
            fieldseq, = fields
            try:
                # convert to string sequence if string
                fieldseq = fieldseq.split(sep)
            except AttributeError:
                # not a string; assume other iterable
                pass
        except ValueError:
            # not a single argument and not a string
            fieldseq = fields
        invalid_fields = [field for field in fieldseq if not validator(field)]
        if invalid_fields:
            raise ValueError('One or more field names is invalid:\n'
                             '{!r}'.format(invalid_fields))
    else:
        raise ValueError('No fields were provided')
    try:
        yield from fieldseq
    except TypeError as e:
        raise ValueError('Single field argument must be a string'
                         'or an interable') from e

いくつかのテスト:

from . import getfields

def test_getfields_novalidation():
    result = ['a', 'b']
    assert list(getfields('a b')) == result
    assert list(getfields('a,b', sep=',')) == result
    assert list(getfields('a', 'b')) == result
    assert list(getfields(['a', 'b'])) == result
1
Rick Teachey