NameError: tên toàn cầu 'unicode' không được xác định - trong Python 3


136

Tôi đang cố gắng sử dụng gói Python có tên là pricei. Trong một mô-đun trong gói này (Thuật toán), có một số dòng gây ra lỗi cho tôi, mặc dù đó là một phần của gói.

Dưới đây là các dòng:

# 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

và đây là thông báo lỗi:

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

Tôi nên viết lại phần mã này như thế nào để nó hoạt động trong Python3? Ngoài ra nếu bất cứ ai đã sử dụng gói thầu với Python 3, vui lòng cho tôi biết nếu họ có tìm thấy sự cố tương tự hay không. Tôi đánh giá cao sự giúp đỡ của bạn.

Câu trả lời:


213

Python 3 đổi tên thành unicodeloại str, strloại cũ đã được thay thế bằng bytes.

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

Bạn có thể muốn đọc phần mềm Python 3 port HOWTO để biết thêm chi tiết như vậy. Ngoài ra còn có Lennart Regebro's Porting to Python 3: Hướng dẫn chuyên sâu , trực tuyến miễn phí.

Cuối cùng nhưng không kém phần quan trọng, bạn chỉ có thể thử sử dụng 2to3công cụ để xem cách dịch mã cho bạn.


Vậy tôi có nên viết: if isinstance (unicode_or_str, str) không? Làm thế nào về 'unicode_or_str'?
TJ1

1
Tên biến không quan trọng ở đây; if isinstance(unicode_or_str, str)chỉ nên làm việc Đổi tên tên biến là tùy chọn.
Martijn Pieters

5
@ TJ1: Đảm bảo bạn đã không xóa dấu ngoặc đơn đóng hoặc một cái gì đó ở đâu đó. Mã sẽ hoạt động tốt với chỉ cần unicode thay thế bằng str.
Martijn Pieters

bạn nói đúng Martijn, tôi quên bao gồm: trong mã của tôi, cảm ơn vì sự giúp đỡ, nó hoạt động ngay bây giờ.
TJ1

Tôi thích công cụ 2to3
ji-ruh

22

Nếu bạn cần để kịch bản tiếp tục hoạt động trên python2 và 3 như tôi đã làm, điều này có thể giúp ai đó

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

và sau đó có thể làm ví dụ

foo = unicode.lower(foo)

1
Đây là ý kiến ​​đúng, câu trả lời tốt đẹp. Chỉ cần thêm một chi tiết, nếu bạn đang sử dụng sixthư viện để quản lý khả năng tương thích Python 2/3, bạn có thể thực hiện điều này: if six.PY3: unicode = strthay vì sys.version_infocông cụ. Điều này cũng rất hữu ích để ngăn chặn các lỗi kẻ nói dối liên quan đến unicode không được xác định trong Python 3, mà không cần miễn trừ quy tắc kẻ lừa đảo đặc biệt.
ely

20

Bạn có thể sử dụng sáu thư viện để hỗ trợ cả Python 2 và 3:

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

1

Hy vọng bạn đang sử dụng Python 3, Str là unicode theo mặc định, vì vậy vui lòng Thay thế Unicodechức năng bằng Strchức năng Chuỗi .

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

2
không bảo tồn BC như câu trả lời từ @atm Vui lòng xem xét rút lại hoặc cập nhật câu trả lời của bạn. Không có lý do gì để bỏ lại người dùng python2 hoặc phá vỡ python3
MrMesees
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.