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.