NameError: ไม่ได้กำหนดชื่อโกลบอล 'unicode' - ใน Python 3


146

ฉันพยายามใช้แพ็คเกจ Python ชื่อ bidi ในโมดูลในแพ็คเกจนี้ (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 ได้อย่างไร นอกจากนี้หากใครเคยใช้แพ็คเกจ bidi กับ Python 3 โปรดแจ้งให้เราทราบหากพบปัญหาที่คล้ายกันหรือไม่ ฉันขอขอบคุณสำหรับความช่วยเหลือของคุณ

คำตอบ:


231

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 การพอร์ต HOWTOสำหรับรายละเอียดเพิ่มเติม นอกจากนี้ยังมีPorting to Python 3ของ Lennart Regebro : คู่มือเชิงลึกออนไลน์ฟรี

สุดท้าย แต่ไม่ท้ายสุดคุณสามารถลองใช้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

28

หากคุณต้องการให้สคริปต์ทำงานบน 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สิ่งต่างๆ นอกจากนี้ยังมีประโยชน์อย่างมากในการป้องกันข้อผิดพลาดของ linter ที่เกี่ยวข้องกับ unicode ที่ไม่ได้กำหนดไว้ใน Python 3 โดยไม่จำเป็นต้องมีการยกเว้นกฎลินเตอร์พิเศษ
ely

23

คุณสามารถใช้หกไลบรารีเพื่อรองรับทั้ง Python 2 และ 3:

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

1

หวังว่าคุณจะใช้ Python 3 Str เป็น Unicode ตามค่าเริ่มต้นดังนั้นโปรดแทนที่Unicodeฟังก์ชันด้วยStrฟังก์ชันString

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

2
ที่ไม่รักษา BC เหมือนคำตอบจาก @atm โปรดพิจารณาถอนหรืออัปเดตคำตอบของคุณ ไม่มีเหตุผลที่จะทิ้งผู้ใช้ python2 ไว้ข้างหลังหรือทำลาย python3
MrMesees
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.