변수 유형이 문자열인지 확인하는 방법?


766

파이썬에서 변수의 유형이 있는지 확인하는 방법이 있나요 string처럼은 :

isinstance(x,int);

정수 값?


11
python canonical.org/~kragen/isinstance를 배우는 경우 isinstance에 대한 필수 자료입니다 .
whaley


이후 정수에주의하십시오 isinstance(True, int) is True.
Albert Tugushev

isinstance(x,str)파이썬 3에서 정확합니다 (str은 기본 유형입니다).
MasterControlProgram

답변:


1138

파이썬 2.x에서는

isinstance(s, basestring)

basestring및 의 추상 슈퍼 클래스 입니다 . 객체가 또는 의 인스턴스인지 테스트하는 데 사용할 수 있습니다 .strunicodestrunicode


Python 3.x에서 올바른 테스트는

isinstance(s, str)

bytes클래스는 Python 3에서 문자열 유형으로 간주되지 않습니다.


10
@Yarin : 아니요. 그러나 Python 3.x는 Python 2.x와 전혀 호환되지 않기 때문에 중요하지 않습니다.
netcoder

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

7
@Yarin 2.x에서 3.x로 무언가를 포팅하는 경우 언제든지을 지정할 수 있습니다 basestring = str.
Jack

9
@AdamErickson 정확히 무엇과의 호환성을 위해? Python 3에는 없기 때문에 Python 3과의 호환성에 도움이되지 않습니다. unicodePython 2와 3 간의 호환성에 대한 권장 사항은 "six"라이브러리를 사용하는 것입니다. ( isintance(s, six.string_types)
특히이

222

나는 이것이 오래된 주제라는 것을 알고 있지만 Google에 처음으로 표시된 주제이며 만족스러운 답변을 찾지 못하면 나중에 참조 할 수 있도록 여기에 남겨 둘 것입니다.

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
예를 들어 하나의 라이너 : value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring), 여기서 >=파이썬 4+ str는 문자열 의 루트 클래스를 유지한다고 가정합니다 .
Pi Marillion

63

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

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 호출을 포함하여 여러 곳에서 얻을 수있는 유니 코드 문자열을 조심하십시오.

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

1
잘 잡았습니다. 나는베이스 스트링에 대해 몰랐다. 3 개의 게시물이 언급되어 있으며 더 나은 답변 인 것 같습니다.
웨이드 해 틀러

6
isinstance()또한 두 번째 인수로 튜플 을 사용합니다. 따라서 basestring존재하지 않더라도을 사용할 수 있습니다 isinstance(target, (str, unicode)).
Martijn Pieters

3
python 3.5.1에서는 다음 unicode과 같이 정의되지 않은 것으로 보입니다.NameError: name 'unicode' is not defined
Eric Hu

11

이후 basestringPython3에 정의되지 않은이 작은 트릭 코드가 호환되도록하는 데 도움이 될 수 있습니다

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

유니 코드를 포함한 파이썬 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파이썬 2에서 기본적으로하고, 두 번째 메이크업은 str인스턴스되고 unicode. 그것들은 파이썬 2와 3에서 코드를 유효하게 만듭니다. 다시 한번 감사합니다!
Narann

9

또한 변수 유형이 특정 종류인지 확인하려면 변수 유형을 알려진 객체의 유형과 비교할 수 있습니다.

문자열의 경우 이것을 사용할 수 있습니다

type(s) == type('')

7
이것은 파이썬에서 체크를 입력하는 끔찍한 끔찍한 방법입니다. 다른 클래스에서 상속 받으면 str어떻게됩니까? str2.x 에서 상속받지 않는 유니 코드 문자열은 어떻습니까? isinstance(s, basestring)2.x 또는 isinstance(s, str)3.x 에서 사용하십시오 .
Jack

1
@ 잭, 질문을 읽고, 그것이 최선의 방법이라는 것을 쓰지 말고 다른 방법으로 쓰십시오.
Daniil Grankin

9
이것은 세 가지 이유로 나쁜 생각입니다. 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 또는 basestringPython 2 인지 확인하는 데 사용 합니다.


1
이것은 파이썬 4에서 깨질 것 >=입니다. 적어도 고려하십시오 .
thakis

2
six.string_types 또는 six.text_type을 확인하는 것이 더 깨끗합니다
daonb

@daonb는 단 한 줄의 테스트를 수행하기 위해 전체 모듈을 가져 오는 것은 미친 의존성 트리와 심각한 부풀어 오르는 것을 작고 간단한 것이 무엇인지 망칠 생각입니다. 그것은 물론 당신의 전화이지만, 그냥 말하십시오 ...
duanev

@duanev 파이썬 2/3 호환성에 대해 걱정한다면 어쨌든 프로젝트에서 6을 사용하는 것이 좋습니다. 6은 단일 파일 이므로 종속성 트리 / 팽창은 문제가되지 않습니다.
MoxieBall

7

basestring을 사용하지 않는 Python 2의 다른 방법 :

isinstance(s, (str, unicode))

그러나 파이썬 3 unicode에서는 정의되지 않았기 때문에 여전히 파이썬 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 compat 코드로 Py3 코드로 작성되었습니다.
  • 나중에 Py2 compat 코드를 중단없이 제거하십시오. 즉, 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 함수를 사용하여 입력 데이터가 string 또는 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
vaultah
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.