[python] 파이썬 2와 3 호환성을 가진 변수가 문자열인지 확인하는 방법

isinstance(x, str)python-3.x에서 다음 을 사용할 수 있음을 알고 있지만 python-2.x의 문자열인지 확인해야합니다. 윌 isinstance(x, str)파이썬 2.x에서의 예상대로 작동? 아니면 버전을 확인하고 사용해야 isinstance(x, basestr)합니까?

특히 python-2.x에서 :

>>>isinstance(u"test", str)
False

python-3.x에는 없습니다. u"foo"



답변

2.x-and-3.x 호환 코드를 작성하는 경우 아마 다음과 같이 6 을 사용하고 싶을 것입니다 .

from six import string_types
isinstance(s, string_types)


답변

6과 같은 패키지에 의존하지 않고 내가 찾은 가장 간결한 방법은 다음과 같습니다.

try:
  basestring
except NameError:
  basestring = str

그런 다음 가장 일반적인 방식으로 Python 2에서 문자열을 확인했다고 가정하면,

isinstance(s, basestring)

이제 Python 3 이상에서도 작동합니다.


답변

이 모든 것은 어떤 경우에 적용됩니까?

isinstance(x, ("".__class__, u"".__class__))


답변

이것은 @Lev Levitsky의 답변입니다.

try:
    isinstance("", basestring)
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

try/ except시험은 한 번 수행하고 항상 작동하고 가능한 한 빨리 함수를 정의합니다.

편집 : 실제로, 우리는 심지어 전화 할 필요가 없습니다 isinstance(); 우리는 단지 평가 basestring하고 우리가 NameError:

try:
    basestring  # attempt to evaluate basestring
    def isstr(s):
        return isinstance(s, basestring)
except NameError:
    def isstr(s):
        return isinstance(s, str)

isinstance()하지만에 대한 호출을 따르는 것이 더 쉽다고 생각합니다 .


답변

future라이브러리 (파이썬 2) 추가 호환 이름 이 수, 파이썬 3 쓰기 계속 . 간단하게 다음을 수행 할 수 있습니다.

from builtins import str
isinstance(x, str) 

설치하려면 실행하십시오 pip install future.

A와 주의 , 그것은 단지 지원 python>=2.6, >=3.3하지만보다 더 현대적인 six전용되는, 사용하는 경우 권장python 2.5


답변

어쩌면 다음과 같은 해결 방법을 사용하십시오.

def isstr(s):
    try:
        return isinstance(s, basestring)
    except NameError:
        return isinstance(s, str)


답변

object.__class__객체가 기본 문자열 유형인지 확인하려면을 호출하여 객체의 클래스를 가져올 수 있습니다 .

    isinstance(object,"".__class__)

따옴표로 묶은 문자열이 파이썬 2에서 유니 코드로 표시되도록 코드 상단에 다음을 배치 할 수 있습니다.

    from __future__ import unicode_literals