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


171

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
유니 코드 리터럴에 대한 u ""구문은 Python 3.3에서 다시 도입되었습니다.
jfs

이상한. 나는 (basestring, U "테스트") >>> isinstance```진정한```파이썬 2.7.16에 얻을
Darakian

답변:


209

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

from six import string_types
isinstance(s, string_types)

다음 결과에 대해 약간 혼란스러워합니다. >>> isinstance(u"foo", string_types) True >>> isinstance(u"foo".encode("utf-8"), string_types) True isinstance (u "foo", string_types)가 false를 반환 할 것으로 예상했습니다.
Chandler.Huang

1
@ Chandler.Huang이 질문은 Python 2 또는 Python 3을 식별 str하고 사용 unicode하는 것에 관한 것 입니다. Python 2 str를 믿지 않으려면 unicode을 사용하십시오 str.
ecatmur

@ecatmur woops, 감사합니다! 그것을 삭제, 아무도 혼란스러워
runDOSrun

4
future패키지 대신 다음과 six같이 사용할 수도 있습니다 .from future.utils import string_types
SuperGeo

113

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

try:
  basestring
except NameError:
  basestring = str

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

isinstance(s, basestring)

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


10
py3에 대해서는 basestring = (str, bytes)에서requests/compat.py
Tanky 우

근데 왜? Python3이 이전 버전과 호환된다면 좋을 것입니다. 위의 솔루션이 작동합니다. 필요하지 않으면 더 좋을 것입니다.
guettli

2
py2 & 3 지원과 mypy를 모두 만족시키기 위해, 나는 결국if not hasattr(__builtins__, "basestring"): basestring = (str, bytes)
Dave Lee

35

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

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

@holdenweb : 아니요. 예. "필요한 경우에만 영향을줍니다"해킹이라고 생각합니다.
Dilettant

1
이 답변이
마음에 드는 이유

4
또한이 옵션을 사용하여 도우미 함수로 래핑 했으므로 한 번만 나타나고 docstring에 Fil을 쓸 곳이 있습니다.
Carl Smith

2
깔끔하고, 나는 또한 내가 from __future__ import unicode_literals활동적 이라는 것을 깨달을 때까지 스스로 그것을 사용하고있었습니다 . isinstance(val, (str, u"".__class__))
Graham Klyne

18

이것은 @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()하지만에 대한 호출을 따르는 것이 더 쉽다고 생각합니다 .


isinstance("", basestring)"전화"의 의미입니다. 어쨌든 +1.
Lev Levitsky

1
파이썬은 매우 역동적 인 언어이므로 테스트를하는 것이 전혀 나쁘지 않다고 생각합니다. 이것은 무언가를 한 번 알아내는 데 유용한 기술이며,이를 바탕으로 항상 올바른 기능을 설정합니다. +1 주셔서 감사합니다.
steveha

5
나는 다음과 같이 썼다 :try: string_types = basestring except NameError: string_types = str
jfs

12

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

from builtins import str
isinstance(x, str) 

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

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


8

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

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

당신을 버그로 미안하지만 Window 7에서 Python 3.2.3을 사용 isinstance(u'hello', basestr)하면 SyntaxError: invalid syntax나에게 도움이됩니다. 이 같은하지 않는 것 u- 내가 함께이 오류 strbasestr
Levon

1
@Levon 문제 없음 :) 파이썬 3 에서와 같이 str파이썬 3은 그 정의가 없기 때문에 정의에 따르면 유니 코드입니다. 따라서 basestring유형 이 없으므로 NameError내 스 니펫에 잡 힙니다.
Lev Levitsky

그것은 지금 그 구문을 noop로 가지고 있습니다. 3.3
랜달 헌트

2
한 번에 try/ except테스트를 수행하는 것이 좋습니다. 단일 테스트의 결과에 따라 isstr()올바르게 정의하십시오 . 에 대한 모든 호출에 대해 예외의 오버 헤드가 발생할 필요는 없습니다 isstr().
steveha

@Ranman은 Python 3.3에 관한 것입니다. 여기 에 PEP 링크가 있습니다.
Lev Levitsky

7

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

    isinstance(object,"".__class__)

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

    from __future__ import unicode_literals

나는이 솔루션을 꽤 조금. str = "".__ class__를 정의하면 유용합니다. 이제 isinstance (object, str)를 정상적으로 작성하고 str (object)가 Python 2와 Python 3 모두에서 유니 코드 문자열을 반환하도록합니다.
amicitas

이것은 XML을 파싱 할 때 작동하지 않습니다 : some_element.text'str'이지만 'unicode'와의 비교는 실패합니다
vault

파이썬 2에서 유니 코드 문자열로 작동하지 않습니다 : isinstance (u'XXX ',' '.__ class__) == False
Fil

0

코드 시작 부분에서 시도해 볼 수 있습니다.

from __future__ import print_function
import sys
if sys.version[0] == "2":
    py3 = False
else:
    py3 = True
if py3: 
    basstring = str
else:
    basstring = basestring

나중에 코드에서 :

anystring = "test"
# anystring = 1
if isinstance(anystring, basstring):
    print("This is a string")
else:
    print("No string")

0

조심해! 파이썬 2에서 strbytes본질적으로 동일합니다. 둘을 구별하려고하면 버그가 발생할 수 있습니다.

>>> size = 5    
>>> byte_arr = bytes(size)
>>> isinstance(byte_arr, bytes)
True
>>> isinstance(byte_arr, str)
True

-4

유형 (문자열) == str

문자열이면 true를 반환하고 그렇지 않으면 false를 반환합니다.


1
아니 사실 파이썬 2를위한 string유니 코드 문자열입니다
lxop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.