NameError: il nome globale 'unicode' non è definito - in Python 3


136

Sto cercando di usare un pacchetto Python chiamato bidi. In un modulo in questo pacchetto (algoritmo.py) ci sono alcune righe che mi danno errore, sebbene faccia parte del pacchetto.

Ecco le linee:

# 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

ed ecco il messaggio di errore:

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

Come devo riscrivere questa parte del codice in modo che funzioni in Python3? Inoltre, se qualcuno ha usato il pacchetto bidi con Python 3, per favore fatemi sapere se hanno riscontrato problemi simili o meno. Apprezzo il vostro aiuto.

Risposte:


214

Python 3 ha rinominato il unicodetipo in str, il vecchio strtipo è stato sostituito da bytes.

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

Potresti voler leggere l' HOWTO di porting di Python 3 per maggiori dettagli. Esiste anche il porting su Python 3 di Lennart Regebro : una guida approfondita , gratuita online.

Ultimo ma non meno importante, potresti semplicemente provare a utilizzare lo 2to3strumento per vedere come questo traduce il codice per te.


Quindi dovrei scrivere: if isinstance (unicode_or_str, str)? Che ne dici di "unicode_or_str"?
TJ1

1
Il nome della variabile non ha molta importanza qui; if isinstance(unicode_or_str, str)dovrebbe funzionare. La ridenominazione del nome della variabile è facoltativa.
Martijn Pieters

5
@ TJ1: assicurati di non aver rimosso una parentesi chiusa o qualcosa da qualche parte. Il codice dovrebbe funzionare bene con appena unicode sostituito con str.
Martijn Pieters

hai ragione Martijn, ho dimenticato di includere: nel mio codice, grazie per l'aiuto, ora funziona.
TJ1

Mi piace lo strumento 2to3
ji-ruh,

22

Se hai bisogno che lo script continui a funzionare su python2 e 3 come ho fatto io, questo potrebbe aiutare qualcuno

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

e può quindi fare solo per esempio

foo = unicode.lower(foo)

1
Questa è l'idea giusta, bella risposta. Solo per aggiungere un dettaglio, se stai usando la sixlibreria per gestire la compatibilità con Python 2/3, puoi farlo: if six.PY3: unicode = strinvece di sys.version_infocose. Questo è anche molto utile per prevenire errori di linter relativi all'unicode in Python 3, senza la necessità di speciali esenzioni per le regole di linter.
ely,

20

Puoi usare le sei librerie per supportare sia Python 2 che 3:

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

1

Spero che tu stia usando Python 3, Str sono Unicode per impostazione predefinita, quindi ti preghiamo di sostituire la Unicodefunzione con la Strfunzione String .

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

2
che non preserva BC come la risposta di @atm Considerare di ritirare o aggiornare la risposta. Non c'è motivo di lasciarsi alle spalle gli utenti di python2 o di rompere python3
MrMesees
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.