Pythonオブジェクトが文字列(通常またはUnicode)かどうかをどうやって確認できますか?
オブジェクトo
が文字列型のサブクラスの文字列型かどうかを調べるには、次のようにします。
isinstance(o, basestring)
なぜならstr
とunicode
はどちらもbasestring
のサブクラスだからです。
o
の型が正確にstr
であるかどうかを確認するには、次のようにします。
type(o) is str
o
がstr
のインスタンスまたはstr
のサブクラスのいずれであるかを確認するには、次のようにします。
isinstance(o, str)
str
をunicode
に置き換えた場合、上記はUnicode文字列に対しても機能します。
ただし、明示的な型チェックをまったく行う必要はないかもしれません。 「ダックタイピング」はあなたのニーズに合うかもしれません。 http://docs.python.org/glossary.html#term-duck-typing を参照してください。
Python 3.xでは、basestring
が唯一の文字列型であるため(Python 2.xのstr
のセマンティクスを使用)、unicode
は使用できなくなりました。
そのため、Python 3.xでの確認は以下のとおりです。
isinstance(obj_to_test, str)
これは、公式の2to3
変換ツールの fix に続く:basestring
をstr
に変換する。
Pythonのバージョン(2.x vs 3.x)に関係なくチェックしたい場合は、 six
( PyPI )およびその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
私はこれをもっとPythonic
で見つけました:
if type(aObject) is str:
#do your stuff here
pass
型オブジェクトはシングルトンなので、isを使用してオブジェクトとstr型を比較できます。
明示的な型チェックを避けたい場合(およびはそれを避けたほうがよいの理由です)、チェックする文字列プロトコルの最も安全な部分は次のとおりです。
str(maybe_string) == maybe_string
それはイテレータやイテレータを介して反復することはありません、それは文字列のリストを呼び出すことはありませんし、それは正しく stringlike を正しく検出します。文字列.
もちろん欠点もあります。例えば、str(maybe_string)
は重い計算になるかもしれません。よくあることだが、答えはである。
あなたの変数があなたが好むものであるかどうかをチェックするために:
s='Hello World'
if isinstance(s,str):
#do something here,
Isistanceの出力にはブール値のTrueまたはFalseの値が表示されるので、それに応じて調整できます。最初に次のようにしてあなたの値の予想される頭字語をチェックすることができます。
他の人が言うように、私はアヒルタイプのスタイルでこれを扱うかもしれません。文字列が本当に文字列であることをどうやって知ることができますか?さて、明らかにそれを文字列に変換することによって!
def myfunc(Word):
Word = unicode(Word)
...
引数がすでに文字列型またはUnicode型の場合、real_Wordはその値を変更せずにそのまま保持します。渡されたオブジェクトが__unicode__
メソッドを実装している場合、それはそのUnicode表現を取得するために使用されます。渡されたオブジェクトが文字列として使用できない場合、unicode
組み込み関数は例外を発生させます。
isinstance(your_object, basestring)
あなたのオブジェクトが本当に文字列型であればTrueになります。 'str'は予約語です。
私の謝罪、正しい答えはUnicode文字列を含めるためにも 'str'の代わりに 'basestring'を使用することです。
空の文字列と連結してテストできます。
def is_string(s):
try:
s += ''
except:
return False
return True
編集:
リストでこれが失敗すると指摘したコメントの後の私の答えを修正する
def is_string(s):
return isinstance(s, basestring)
今夜私は私が考えた状況に出くわしました私は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