NameError: nama global 'unicode' tidak didefinisikan - dengan Python 3

136

Saya mencoba menggunakan paket Python bernama bidi. Dalam sebuah modul dalam paket ini (algorithm.py) ada beberapa baris yang memberi saya kesalahan, meskipun itu adalah bagian dari paket.

Inilah garis-garisnya:

# 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

dan di sini adalah pesan kesalahan:

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

Bagaimana saya harus menulis ulang bagian kode ini agar berfungsi di Python3? Juga jika ada yang menggunakan paket bidi dengan Python 3 tolong beri tahu saya jika mereka menemukan masalah yang sama atau tidak. Saya menghargai bantuan Anda.

TJ1
sumber

Jawaban:

214

Python 3 mengubah nama unicodetipe menjadi str, strtipe lama telah diganti oleh bytes.

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

Anda mungkin ingin membaca Python 3 porting HOWTO untuk detail lebih lanjut. Ada juga Porting Lennart Regebro ke Python 3: Panduan mendalam , online gratis.

Terakhir tetapi tidak kalah pentingnya, Anda bisa mencoba menggunakan 2to3alat ini untuk melihat bagaimana hal itu menerjemahkan kode untuk Anda.

Martijn Pieters
sumber
Jadi saya harus menulis: jika isinstance (unicode_or_str, str)? Bagaimana dengan 'unicode_or_str'?
TJ1
1
Nama variabel tidak terlalu penting di sini; if isinstance(unicode_or_str, str)seharusnya hanya bekerja. Mengganti nama nama variabel adalah opsional.
Martijn Pieters
5
@ TJ1: Pastikan Anda tidak menghapus tanda kurung tutup atau sesuatu di suatu tempat. Kode harus bekerja dengan baik dengan yang baru saja unicode diganti str.
Martijn Pieters
Anda benar Martijn, saya lupa memasukkan: dalam kode saya, terima kasih atas bantuannya, ini berfungsi sekarang.
TJ1
Saya suka alat 2to3
ji-ruh
22

Jika Anda perlu membuat skrip tetap bekerja pada python2 dan 3 seperti yang saya lakukan, ini dapat membantu seseorang

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

dan kemudian bisa lakukan misalnya

foo = unicode.lower(foo)
Neil McGill
sumber
1
Ini adalah ide yang tepat, jawaban yang bagus. Hanya untuk menambahkan detail, jika Anda menggunakan sixpustaka untuk mengelola kompatibilitas Python 2/3, Anda dapat membuatnya: if six.PY3: unicode = stralih-alih sys.version_infobarang. Ini juga sangat membantu untuk mencegah kesalahan linter terkait unicode tidak terdefinisi dalam Python 3, tanpa memerlukan pengecualian aturan linter khusus.
Ely
20

Anda bisa menggunakan enam pustaka untuk mendukung Python 2 dan 3:

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

Harap Anda menggunakan Python 3, Str secara unicode, jadi silakan Ganti Unicodefungsi dengan Strfungsi String .

if isinstance(unicode_or_str, str):    ##Replaces with str
    text = unicode_or_str
    decoded = False
MJ
sumber
2
yang tidak melindungi BC seperti jawaban dari @atm Harap pertimbangkan mencabut atau memperbarui jawaban Anda. Tidak ada alasan untuk meninggalkan pengguna python2 atau melanggar python3
MrMesees