変数の型が文字列かどうかを確認するにはどうすればよいですか?


766

Pythonで変数の型があるかどうかを確認する方法があるstringようには、:

isinstance(x,int);

整数値の場合?


11
python canonical.org/~kragen/isinstanceを学習している場合は、isinstanceの必須資料。
クジラ2011年


以降、intに注意してくださいisinstance(True, int) is True
Albert Tugushev

isinstance(x,str)Python 3では正しいです(strは基本型です)。
MasterControlProgram

回答:


1139

Python 2.xでは、

isinstance(s, basestring)

basestringおよびの抽象スーパークラスです。オブジェクトがインスタンスであるかどうかを試験するために使用することができ、または。strunicodestrunicode


Python 3.xでは、正しいテストは

isinstance(s, str)

bytesクラスはPythonの3の文字列型とはみなされません。


10
@ヤリン:いいえ。ただし、Python 3.xはPython 2.xとの互換性をまったく意図していないため、問題ではありません。
ネットコーダー2013

2
isinstance(s、str)はpy27で動作し、Python 2.7.5(デフォルト、2013年8月25日00:04:04)で動作することがわかりました[GCC 4.2.1互換Apple LLVM 5.0(clang-500.0.68)]ダーウィンで。
kakyo

25
@kakyo:問題は、unicode文字列と見なされるべきオブジェクトが欠落することです。タイプstrとタイプの両方にunicode共通の基本クラスbasestringがあり、これがチェック対象です。
Sven Marnach 14年

7
@Yarin 2.xから3.xに何かを移植する場合、いつでも割り当てることができますbasestring = str
ジャック

9
@AdamErickson正確に何との互換性のために?Python 3にはないため、Python 3との互換性には役立ちません。Python2 unicodeと3の互換性については、「six」ライブラリを使用することをお勧めします。(特にisintance(s, six.string_types)この場合)
Sven Marnach

222

私はこれが古いトピックであることを知っていますが、グーグルで最初に表示されたものであり、満足のいく答えが見つからなかったので、今後の参考のためにここに残します。

sixはPython 2および3の互換性ライブラリで、すでにこの問題をカバーしています。その後、次のようなことができます:

import six

if isinstance(value, six.string_types):
    pass # It's a string !!

コードを検査すると、次のことがわかります。

import sys

PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
else:
    string_types = basestring,

4
たとえば、1つのライナーの場合:value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)>=最終的なPython 4以降では、str文字列のルートクラスが保持されると想定します。
Pi Marillion 2016年

64

Python 3.xまたはPython 2.7.6

if type(x) == str:

10
「if type(x)in(str、unicode):」の優雅さは好きですが、PyLintが「unidiomatic」とフラグを立てているのがわかります。
eukras

15
と型を比較す​​ること==は、PEP8によって明示的に推奨されていません。また、「一義的」と見なされることに加えて、いくつかの欠点があります。たとえば、str文字列と見なされるべきのサブクラスのインスタンスは検出されません。タイプを正確にチェックしstr、サブクラスを明示的に除外する場合は、を使用しますtype(x) is str
Sven Marnach、2017年

17

できるよ:

var = 1
if type(var) == int:
   print('your variable is an integer')

または:

var2 = 'this is variable #2'
if type(var2) == str:
    print('your variable is a string')
else:
    print('your variable IS NOT a string')

お役に立てれば!



11

以下のより適切な回答に基づいて編集してください。約3つの回答を調べて、ベースストリングのクールさについて調べます。

古い答え:WindowsのすべてのCOM呼び出しを含め、いくつかの場所から取得できるUnicode文字列に注意してください。

if isinstance(target, str) or isinstance(target, unicode):

1
良いキャッチ。ベースストリングについては知りませんでした。それは3つの投稿について言及されており、より良い答えのようです。
ウェイドハトラー、2014

6
isinstance()2番目の引数としてタプルも受け取ります。そのbasestringため、存在しなかったとしても、そのまま使用できますisinstance(target, (str, unicode))
Martijn Pieters

3
Python 3.5.1ではunicode定義されていないようです:NameError: name 'unicode' is not defined
Eric Hu

11

以降basestringのpython3で定義されていない、この小さなトリックは、コード互換性を持たせるために役立つかもしれません。

try: # check whether python knows about 'basestring'
   basestring
except NameError: # no, it doesn't (it's Python3); use 'str' instead
   basestring=str

その後、Python2とPython3の両方で次のテストを実行できます

isinstance(myvar, basestring)

4
または、バイト文字列もキャッチしたい場合:basestring = (str, bytes)
Mark Ransom

10

ユニコードを含むPython 2/3

from __future__ import unicode_literals
from builtins import str  #  pip install future
isinstance('asdf', str)   #  True
isinstance(u'asdf', str)  #  True

http://python-future.org/overview.html


1
どうもありがとう!インターネットには何十ものさまざまな答えがありますが、唯一の良い答えはこれです。最初の行は作るtype('foo')ことunicodeのPython 2ではデフォルトで、2つ目のメイクは、strのインスタンスですunicode。これらにより、Python 2および3でコードが有効になります。ありがとうございます。
Narann、

9

また、変数の型が特定の種類であるかどうかを確認する場合は、変数の型を既知のオブジェクトの型と比較できることにも注意してください。

文字列の場合、これを使用できます

type(s) == type('')

7
これは、Pythonでタイプチェックを行うためのひどい方法です。別のクラスが継承した場合はどうなりstrますか?str2.x から継承しないユニコード文字列はどうですか?isinstance(s, basestring)2.xまたはisinstance(s, str)3.xで使用します。
ジャック

1
@ジャック、質問を読んでください。また、私はそれが最善の方法であり、別の方法であると書いていないことにも注意してください。
Daniil Grankin、2015

9
これは3つの理由で悪い考えです。isinstance()サブクラス(これも文字列であり、特殊化されている)をtype('')許可strします。使用できるだけで型がシングルトンの場合、追加の呼び出しは冗長であるためtype(s) is str、より効率的なテストになります。
Martijn Pieters

8

ここには他の人からの良い提案がたくさんありますが、クロスプラットフォームの良い要約はありません。以下は、あらゆるPythonプログラムに適したものです。

def isstring(s):
    # if we use Python 3
    if (sys.version_info[0] >= 3):
        return isinstance(s, str)
    # we use Python 2
    return isinstance(s, basestring)

この関数でisinstance(object, classinfo)は、strPython 3 basestringとPython 2のどちらの入力かを確認するために使用します。


1
これはおそらくPython 4で機能しなくなり>=ます。少なくとも検討してください。
thakis

2
six.string_typesまたはsix.text_typeをチェックするためにきれいに
daonb

@daonbが1行のテストを行うためだけにモジュール全体をインポートするのは、クレイジーな依存関係ツリーと深刻な膨張により、短くてシンプルなものを台無しにする考えです。それはもちろんあなたの呼び出しですが、言うだけで...
duanev

@duanev Python 2/3の互換性が心配な場合は、とにかくプロジェクトで6を使用することをお勧めします。Sixも1 つのファイルなので、依存関係ツリー/膨張はここでは問題になりません。
MoxieBall

7

ベースストリングを使用しないPython 2の代替方法:

isinstance(s, (str, unicode))

unicode(Python 3では)が定義されていないため、Python 3ではまだ機能しません。


7

そう、

変数が文字列かどうかを確認するためのオプションがたくさんあります。

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

この順序は目的のためです。


5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

Trueを返します

type(a) in [str, unicode]

Trueを返します


Python 2.7.12の場合、引用符を削除する必要がありました:[str、unicode]のtype(a)
Adam Erickson

4

これらの要件とともに、Python 2とPython 3の両方をサポートするための私の答えは次のとおりです。

  • 最小限のPy2互換コードを含むPy3コードで記述されています。
  • 中断することなく、後でPy2互換コードを削除します。つまり、削除のみを目的とし、Py3コードへの変更はありません。
  • six達成しようとしていることを隠してしまう傾向があるため、類似のcompatモジュールの使用は避けてください。
  • 潜在的なPy4の将来性。

import sys
PY2 = sys.version_info.major == 2

# Check if string (lenient for byte-strings on Py2):
isinstance('abc', basestring if PY2 else str)

# Check if strictly a string (unicode-string):
isinstance('abc', unicode if PY2 else str)

# Check if either string (unicode-string) or byte-string:
isinstance('abc', basestring if PY2 else (str, bytes))

# Check for byte-string (Py3 and Py2.7):
isinstance('abc', bytes)

1

外部ライブラリに依存したくない場合、これはPython 2.7以降とPython 3の両方で機能します(http://ideone.com/uB4Kdc):

# your code goes here
s = ["test"];
#s = "test";
isString = False;

if(isinstance(s, str)):
    isString = True;
try:
    if(isinstance(s, basestring)):
        isString = True;
except NameError:
    pass;

if(isString):
    print("String");
else:
    print("Not String");

1

isinstance関数を使用して、入力データがフォーマット文字列またはUnicodeであることを確認できます。以下の例は、簡単に理解するのに役立ちます。

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True


-6

これが私のやり方です:

if type(x) == type(str()):

4
type(str())非常に遠回りな言い方strです。タイプはシングルトンなのでtype(x) is str、より効率的です。isinstance()のサブクラスを無視する十分な理由がない限り、代わりに使用する必要がありstrます。
Martijn Pieters

type(x)がstrの場合:
shaurya uppal


-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True

2
その場合、あなたは希望type(thing).__name__ == 'str'を超えますtype(thing) == strisinstance(thing, str)?またunicode、最新バージョンのPythonには存在しません。
vaultah 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.