NameError: genel adı 'unicode' tanımlı değil - Python 3'te


136

Bidi adlı bir Python paketi kullanmaya çalışıyorum. Bu paketteki bir modülde (algoritma.py), paketin bir parçası olmasına rağmen bana hata veren bazı satırlar var.

İşte satırlar:

# 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

ve işte hata mesajı:

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'te çalışması için kodun bu bölümünü nasıl yeniden yazmalıyım? Ayrıca Python 3 ile bidi paketi kullanan biri varsa, lütfen benzer sorunlar bulup bulmadığını bana bildirin. Yardımın için minnettarım.

Yanıtlar:


216

Python 3, unicodetürü olarak yeniden adlandırdı, streski strtür ile değiştirildi bytes.

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

Daha fazla ayrıntı için Python 3 porting NASIL belgesini okumak isteyebilirsiniz . Ayrıca Lennart Regebro'nun Python 3'e Porting: Çevrimiçi ücretsiz, kapsamlı bir kılavuz da var .

Son olarak , kodu sizin için nasıl çevirdiğini görmek için 2to3aracı kullanmayı deneyebilirsiniz .


Öyleyse şunu yazmalıyım: if isinstance (unicode_or_str, str)? "Unicode_or_str" nasıl olur?
— TJ1

1
Değişken adının burada pek bir önemi yoktur; if isinstance(unicode_or_str, str)sadece çalışmalı. Değişken adını yeniden adlandırmak isteğe bağlıdır.
— Martijn Pieters

5
@ TJ1: Kapanış parantezlerini veya herhangi bir yerden kaldırmadığınızdan emin olun. Kod sadece para cezası çalışması gerekir sadece unicode değiştirilir str.
— Martijn Pieters

haklısın Martijn, eklemeyi unuttum: koduma, yardım için teşekkürler, şimdi çalışıyor.
— TJ1

2to3 aracını seviyorum
— ji-ruh

23

Eğer betiğin benim yaptığım gibi python2 ve 3 üzerinde çalışmaya devam etmesini istiyorsanız, bu birisine yardımcı olabilir.

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

ve sonra örneğin

foo = unicode.lower(foo)

1
Bu doğru fikir, güzel cevap. Bir ayrıntı eklemek için, sixkütüphaneyi Python 2/3 uyumluluğunu yönetmek için kullanıyorsanız , bunu yapabilirsiniz: malzeme if six.PY3: unicode = stryerine sys.version_info. Bu ayrıca, Unicode ile ilgili linter hatalarının Python 3'te tanımlanmamış olmasını, özel linter kuralı muafiyetlerine gerek kalmadan önlemek için çok yararlıdır.
— ely

20

Hem Python 2 hem de 3'ü desteklemek için altı kitaplığı kullanabilirsiniz :

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

1

Umarım Python 3 kullanıyorsunuzdur, Str varsayılan olarak unicode'dur, bu yüzden lütfen Unicodeişlevi String Strişlevi ile değiştirin .

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

2
BC'yi @atm'deki yanıt gibi korumaz Lütfen yanıtınızı geri çekmeyi veya güncellemeyi düşünün. Python2 kullanıcılarını geride bırakmak veya python3'ü kırmak için hiçbir sebep yok
— MrMesees
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.