NameError : 전역 이름 'unicode'가 정의되지 않았습니다-Python 3


136

bidi라는 Python 패키지를 사용하려고합니다. 이 패키지 (algorithm.py)의 모듈에는 패키지의 일부이지만 오류가 발생하는 행이 있습니다.

라인은 다음과 같습니다.

# utf-8 ? we need unicode
if isinstance(unicode_or_str, unicode):
    text = unicode_or_str
    decoded = False
else:
    text = unicode_or_str.decode(encoding)
    decoded = True

오류 메시지는 다음과 같습니다.

Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    bidi_text = get_display(reshaped_text)
  File "C:\Python33\lib\site-packages\python_bidi-0.3.4-py3.3.egg\bidi\algorithm.py",   line 602, in get_display
    if isinstance(unicode_or_str, unicode):
NameError: global name 'unicode' is not defined

Python3에서 작동하도록 코드의이 부분을 어떻게 다시 작성해야합니까? 또한 누구나 Python 3과 함께 bidi 패키지를 사용했다면 비슷한 문제가 있는지 알려주세요. 도와 주셔서 감사합니다.

답변:


214

Python 3은 unicode유형의 이름을로 바꾸고 str이전 str유형은로 대체되었습니다 bytes.

if isinstance(unicode_or_str, str):
    text = unicode_or_str
    decoded = False
else:
    text = unicode_or_str.decode(encoding)
    decoded = True

자세한 내용 은 Python 3 포팅 ​​하우투 를 읽으십시오 . Lennart Regebro의 Porting to Python 3 : 심층 가이드 , 온라인 무료도 있습니다.

마지막으로 2to3도구 를 사용 하여 코드가 어떻게 변환되는지 확인할 수 있습니다.


그래서 작성해야합니다 : if isinstance (unicode_or_str, str)? 'unicode_or_str'은 어떻습니까?
— TJ1

1
변수 이름은 여기서 중요하지 않습니다. if isinstance(unicode_or_str, str)그냥 작동해야합니다. 변수 이름을 바꾸는 것은 선택 사항입니다.
— Martijn Pieters

5
@ TJ1 : 닫는 괄호 나 다른 것을 제거하지 않았는지 확인하십시오. 코드와 잘 작동합니다 단지 unicode 로 대체 str.
— Martijn Pieters

당신은 맞습니다 Martijn, 나는 포함하는 것을 잊었습니다 : 내 코드에 도움을 주셔서 감사합니다. 지금 작동합니다.
— TJ1

나는 2to3 도구를 좋아한다
— ji-ruh

22

내가했던 것처럼 python2와 3에서 스크립트를 계속 작동시켜야하는 경우 누군가에게 도움이 될 수 있습니다.

import sys
if sys.version_info[0] >= 3:
    unicode = str

그런 다음 예를 들어 할 수 있습니다.

foo = unicode.lower(foo)

1
이것이 올바른 생각입니다. 세부 사항을 추가 six하기 위해 라이브러리를 사용하여 Python 2/3 호환성을 관리 하는 경우 물건 if six.PY3: unicode = str대신 만들 수 있습니다 sys.version_info. 이것은 또한 특별한 린터 규칙 면제가 필요없이 파이썬 3에서 정의되지 않은 유니 코드와 관련된 린터 오류를 방지하는 데 매우 유용합니다.
— ely

20

6 개의 라이브러리를 사용하여 Python 2와 3을 모두 지원할 수 있습니다 .

import six
if isinstance(value, six.string_types):
    handle_string(value)

1

Python 3 사용하고 있기를 바랍니다. Str은 기본적으로 유니 코드이므로 Unicode함수를 String Str함수 로 바꾸십시오 .

if isinstance(unicode_or_str, str):    ##Replaces with str
    text = unicode_or_str
    decoded = False

2
@atm의 답변처럼 BC를 보존하지 않는 답변 답변 철회 또는 업데이트를 고려하십시오. python2 사용자를 남겨 두거나 python3을 깨뜨릴 이유가 없습니다
— MrMesees
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.