Programming

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

procodes 2020. 2. 26. 22:49
반응형

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


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


파이썬 2

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

문서 .


객체 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을 참조 하십시오 .

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


파이썬 3

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

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

isinstance(obj_to_test, str)

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


파이썬 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

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

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

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


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

str(maybe_string) == maybe_string

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

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


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

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

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


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

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

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


isinstance(your_object, basestring)

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

내 사과, 정답은 유니 코드 문자열을 포함하기 위해 '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

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

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

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


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

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

참고 URL : https://stackoverflow.com/questions/1303243/how-to-find-out-if-a-python-object-is-a-string



반응형