파이썬 객체가 문자열인지 확인하는 방법?


402

파이썬 객체가 문자열 (일반 또는 유니 코드)인지 어떻게 확인할 수 있습니까?


18
Jason이 말하는 것은 오리 타이핑입니다 (오리처럼 qua 경우 오리 일 것입니다). 파이썬에서는 문자열이나 문자열 서브 클래스인지 테스트하지 않고 문자열과 같은 객체에서 "코드 작업"을하는 경우가 많습니다. 더 많은 정보를 원하시면 다음을 참조하십시오 docs.python.org/glossary.html#term-duck-typing
벤 호이트

4
그것이 내가 좋아하는 것입니다. 나는 보통 질문을하고, 답을 얻지 못하고, 사람들은 내가 그렇게하지 말아야 할 이유와 이유를 말해주고, 나는 프로그래머로 성장한다. =)
physicsmichael

24
+1 : 대답이 거의 필요하지 않다고해서 질문이 잘못되었다는 의미는 아닙니다. 비록 여기서주의를 기울이는 것이 좋을 것이라고 생각하지만, 그것이 그 질문을 강등시킬만한 가치는 없다고 생각합니다.
Trevor

17
이것은 아마도 파이썬에서 유형 검사를 가장 합법적으로 사용하는 것입니다. 문자열은 반복 가능하므로 다른 방법으로 목록과 구별하는 것은 나쁜 생각입니다.
ojrac

3
문자열을 다른 iterable과 구별 해야하는 경우가 있습니다. 예를 들어 pprint 모듈에서 PrettyPrinter의 소스 코드를 참조하십시오.
saxman01

답변:


302

파이썬 2

isinstance(obj, basestring)테스트 할 객체에 사용 합니다 obj.

문서 .


178

파이썬 2

객체 o가 문자열 유형의 하위 클래스의 문자열 유형 인지 확인하려면

isinstance(o, basestring)

모두 때문에 strunicode의 서브 클래스입니다 basestring.

유형 o이 정확한지 확인하려면 다음을 수행하십시오 str.

type(o) is str

다음 o의 인스턴스 str또는 서브 클래스인지 확인하려면 다음을 수행하십시오 str.

isinstance(o, str)

유니 코드 문자열에 대한 위 또한 작업 바꿀 경우 strunicode.

그러나 명시 적 유형 검사를 수행 할 필요는 없습니다. "Duck 타이핑"은 필요에 맞을 수 있습니다. http://docs.python.org/glossary.html#term-duck-typing을 참조 하십시오 .

파이썬에서 유형을 확인하는 정식 방법무엇입니까?


할당하기 전에 참조 된 지역 변수 'STR'
존 ktejik

@johnktejik python3 대 python2. basestringpy2에서 확인해야합니다 .
erikbwork

170

파이썬 3

Python 3.x에서는 유일한 문자열 유형 (Python 2.x의 시맨틱 포함)과 basestring같이 더 이상 사용할 수 없습니다 .strunicode

따라서 Python 3.x의 검사는 다음과 같습니다.

isinstance(obj_to_test, str)

이것은 다음 수정 공식의 2to3변환 도구 : 변환 basestringstr.


94

파이썬 2와 3

(교차 호환)

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

또는, future( PyPI )를 사용 하여 이름을 유지할 수도 있습니다.from past.builtins import basestring
David Nemeskey

1
치트 시트 BTW는 Python 버전 호환성을위한 훌륭한 리소스입니다.
David Nemeskey

1
수입품을 사용하지 않는 것은 어떻습니까? 먼저 시도한 basestring다음로 넘어갑니다 str. 예 :def is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
isaacbernat

19

나는 이것보다 더 많은 것을 발견했다 pythonic.

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

유형 오브젝트는 싱글이기 때문에, 있다 는 STR 유형에 개체를 비교 할 수 있습니다


4
상속으로 인해 유형에 대해 일반적으로 권장되는 테스트 방법은 아닙니다. 유형을 테스트하기위한 것이므로 isinstance(obj_to_test, str)다른 비 str 사례와 동일한 절차를 사용하는 이점이 있습니다.
Eric O Lebigot

14

하나는 명시 적 유형 검사 (거기에서 멀리하고자하는 경우 입니다 검사가되는 문자열 프로토콜의 그것에서 멀리 좋은 이유), 아마 가장 안전한 부분 :

str(maybe_string) == maybe_string

그것은, 그것은리스트의-문자열 문자열을 호출하지 않습니다하지으로 반복 반복 가능 또는 반복자를 통해 것이며, 그것은 정확하게 감지 stringlike 문자열로합니다.

물론 단점이 있습니다. 예를 들어 str(maybe_string)계산이 무거울 수 있습니다. 자주 대답은 에 달려 있습니다.

편집 : @Tcll 이 주석에서 지적했듯이 질문은 실제로 유니 코드 문자열과 바이트 문자열을 모두 감지하는 방법을 묻습니다. Python 2에서는 ASCII가 아닌 문자를 포함하는 유니 코드 문자열에 대한 예외 로이 답변이 실패하고 Python 3에서는 False모든 바이트 문자열에 대해 반환 됩니다.


표현 데이터로 초기화되는 객체의 경우 예상대로 작동하지 않을 수 있습니다. b = b'test'; r = str(b) == b여기서 b동일한 데이터를 보유 str(b)하지만 (바이트 객체) 문자열로 유효성을 검사하지 않습니다.
Tcll

@Tcll 맞아, 질문은 실제로 "일반 또는 유니 코드"라고 말합니다. 제대로 읽지 않은 것 같습니다.
clacke

11

변수가 어떤 것인지 확인하려면 다음과 같이하십시오.

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

isistance의 출력은 부울 True 또는 False 값을 제공하므로 적절하게 조정할 수 있습니다. 다음을 사용하여 값의 예상 약어를 확인할 수 있습니다. type (s) isstance 함수에서 사용할 수 있도록 'str'유형을 반환합니다.


5

나는 다른 사람들이 언급 한 것처럼 오리 타이핑 스타일로 이것을 다룰 수 있습니다. 문자열이 실제로 문자열인지 어떻게 알 수 있습니까? 글쎄, 분명히 문자열 로 변환 하여!

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

인수가 이미 문자열 또는 유니 코드 유형 인 경우 real_word는 수정되지 않은 값을 보유합니다. 전달 된 객체가 __unicode__메서드를 구현하는 경우 해당 유니 코드 표현을 얻는 데 사용됩니다. 전달 된 객체를 문자열로 사용할 수없는 경우 unicode내장에서 예외가 발생합니다.


3
isinstance(your_object, basestring)

객체가 실제로 문자열 유형이면 True입니다. 'str'은 예약어입니다.

내 사과, 정답은 유니 코드 문자열을 포함하기 위해 'str'대신 'basestring'을 사용하는 것입니다. 다른 응답자 중 한 사람이 위에서 언급했듯이.


질문에서 명시 적으로 요청 된 유니 코드 객체에는 작동하지 않습니다.
dbn

1

오늘 저녁에 나는 유형 에 대해 점검해야 한다고 생각 하는 상황에 부딪 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

간단합니다. 다음 코드를 사용하십시오 (우리는 객체가 obj라고 가정합니다).

if type(obj) == str:
    print('It is a string')
else:
    print('It is not a string.')

0

빈 문자열로 연결하여 테스트 할 수 있습니다.

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

편집 :

이것이 목록과 함께 실패한다고 지적한 후 내 대답을 수정하십시오.

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

지적 해 주셔서 감사합니다. 나는 다른 대답을했다.
georgepsarakis

-3

Python 2.x 및 3.x와 함께 작동하는 보너스를 가진 문자열과 같은 멋진 오리 타이핑 접근 방식 :

def is_string(obj):
    try:
        obj + ''
        return True
    except TypeError:
        return False

wisefishisinstance접근 방식으로 전환하기 전에 오리 유형과 밀접한 관계있었지만+= 목록과는 다른 의미를 갖습니다 +.


2
글쎄, 당신은 두 개의 downvotes가 있고 아무도 의견을 제공하지 않았습니다. 나는 downvoted하지 않았지만 다음과 같은 이유로 솔루션을 좋아하지 않습니다. * 너무 자세합니다. 이를 위해 함수를 정의 할 필요는 없습니다. * 비싸다. 예외 포착은 성능에 좋지 않습니다. * 발생하기 쉬운 오류. 다른 객체는 add를 구현 하고 문자열을보고 TypeError가 아닌 다른 유형의 예외를 발생시킬 수 있습니다.
산티아고 바 술토

또한 여기에서는 오리 타이핑 방식을 사용합니다.이 방법은 아름답 지 만 무언가를 찾기 위해 예외를 던지고 잡는 것으로 끝납니다.
Alexey Tigarev

이것은 합법적으로 문자열 같은 문자열과 다른 반복 가능한 문자열을 구별하는 유일한 확실한 방법 일 수 있습니다. 과 같은 속성을 찾을 수는 isalpha있지만 어떤 방법을 사용하는 것이 안전한지 누가 알 수 있습니까?
clacke

나는 방법에 더하기 평등이 실제로 바보가 될 수 있음깨달았습니다__str__ . 그러나 그조차도 경고가없는 것은 아닙니다.
clacke

@santiagobasulto 예외는 Python에서 저렴합니다. 1 %의 오류가 예상되는 경우 try더 빠를 수 있습니다. 99 %의 시간을 기대한다면 그렇지 않을 수도 있습니다. 성능 차이는 최소화되므로 코드를 프로파일 링하고 실제로 느리게 식별하지 않는 한 관용적 인 것이 좋습니다.
Nick T

-4
if type(varA) == str or type(varB) == str:
    print 'string involved'

EDX-온라인 코스 MITx : 6.00.1x Python을 사용한 컴퓨터 과학 및 프로그래밍 소개


6
이것은 아마도 최악의 확인 방법입니다. 유니 코드 객체를 제외 할뿐만 아니라 하위 클래스도 제외합니다 str!
augurar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.