Pythonオブジェクトが文字列(通常またはUnicode)かどうかを確認するにはどうすればよいですか?
Pythonオブジェクトが文字列(通常またはUnicode)かどうかを確認するにはどうすればよいですか?
回答:
オブジェクトo
が文字列型のサブクラスの文字列型かどうかを確認するには:
isinstance(o, basestring)
両方のためにstr
とunicode
のサブクラスですbasestring
。
のタイプo
が正確かどうかを確認するにはstr
:
type(o) is str
のo
インスタンスstr
またはそのサブクラスであるかどうかを確認するにはstr
:
isinstance(o, str)
あなたが交換する場合は、Unicode文字列のためにも、上記の作業str
でunicode
。
ただし、明示的な型チェックをまったく行う必要がない場合もあります。「ダックタイピング」はあなたのニーズに合うかもしれません。http://docs.python.org/glossary.html#term-duck-typingを参照してください。
も参照してくださいPythonでタイプをチェックするための正規の方法は何ですか?
basestring
py2で確認する必要があります。
Pythonバージョン(2.xと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
basestring
、次ににフォールバックしstr
ます。例def is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
私はこれをもっと見つけましたpythonic
:
if type(aObject) is str:
#do your stuff here
pass
型オブジェクトはシングルトンであるため、さ STR型と比較オブジェクトを実行するために使用することができます
isinstance(obj_to_test, str)
明らかに型のテストを意図しており、str以外の場合と同じ手順を使用できるという利点があります。
明示的な型チェックを避けたい場合(そしてそれを避けた方がよい理由がある場合)、チェックする文字列プロトコルの最も安全な部分は次のとおりです。
str(maybe_string) == maybe_string
iterableまたはiteratorを反復処理せず、string-of-stringsを文字列と呼ばず、stringlikeを文字列として正しく検出します。
もちろん欠点もあります。たとえばstr(maybe_string)
、重い計算になる場合があります。よくあることですが、答えはそれによって異なります。
編集:@Tcll がコメントで指摘しているように、質問は実際にはUnicode文字列とバイト文字列の両方を検出する方法を求めています。Python 2ではこの回答は失敗しますが、ASCII以外の文字を含むUnicode文字列は例外で、Python 3ではFalse
すべてのバイト文字列に対して返されます。
b = b'test'; r = str(b) == b
場合b
と同じデータを保持しているstr(b)
が、(あるオブジェクトをバイト)の文字列として検証されません。
変数が次のようなものかどうかを確認するには:
s='Hello World'
if isinstance(s,str):
#do something here,
isistanceの出力はブール値のTrueまたはFalse値を提供するので、それに応じて調整できます。最初に次を使用して、値の予想される頭字語を確認できます。type(s)これにより、「str」が返されるので、isistance関数で使用できます。
他の人が言うように、私はこれをダックタイピングのスタイルで扱うかもしれません。文字列が本当に文字列であるとどうやって知るのですか?まあ、明らかにそれを文字列に変換することによって!
def myfunc(word):
word = unicode(word)
...
argがすでに文字列またはUnicode型である場合、real_wordはその値を変更せずに保持します。渡されたオブジェクトが__unicode__
メソッドを実装している場合、それはそのユニコード表現を取得するために使用されます。渡されたオブジェクトを文字列として使用できない場合、unicode
組み込み関数は例外を発生させます。
今晩、私はタイプをチェックする必要があると思った状況に出くわしました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
その単純な方法は、次のコードを使用します(ここでは、オブジェクトがobjであると想定しています)
if type(obj) == str:
print('It is a string')
else:
print('It is not a string.')
空の文字列と連結してテストできます。
def is_string(s):
try:
s += ''
except:
return False
return True
編集:
これはリストで失敗することを指摘しているコメントの後に私の答えを修正する
def is_string(s):
return isinstance(s, basestring)
Python 2.xと3.xの両方で作業できるというボーナスがある、文字列のようなダックタイピングアプローチの場合:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
wisefishは、isinstance
アプローチに切り替える前にアヒルのタイピングに近かったが、+=
リストに対して意味が異なる+
。
isalpha
安全なメソッドを知っているのは誰ですか?
try
より速くすることができます。99%の確率で期待できる場合は、そうではないかもしれません。パフォーマンスの違いは最小限であり、コードをプロファイリングして実際に低速であると識別しない限り、慣用的である方が良いです。
if type(varA) == str or type(varB) == str:
print 'string involved'
EDXから-オンラインコースMITx:6.00.1x Pythonを使用したコンピュータサイエンスとプログラミング入門
str
!のサブクラスも除外します。