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.

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.


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)

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)

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.