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.