193

I am trying to use a Python package called bidi. In a module in this package (algorithm.py) there are some lines that give me error, although it is part of the package.

Here are the lines:

# 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

and here is the error message:

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

How should I re-write this part of the code so it works in Python3? Also if anyone have used bidi package with Python 3 please let me know if they have found similar problems or not. I appreciate your help.

8 Answers 8

294

Python 3 renamed the unicode type to str, the old str type has been replaced by bytes.

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

You may want to read the Python 3 porting HOWTO for more such details. There is also Lennart Regebro's Porting to Python 3: An in-depth guide, free online.

Last but not least, you could just try to use the 2to3 tool to see how that translates the code for you.

Sign up to request clarification or add additional context in comments.

2 Comments

So should I write: if isinstance(unicode_or_str, str)? How about 'unicode_or_str'?
The variable name doesn't much matter here; if isinstance(unicode_or_str, str) should just work. Renaming the variable name is optional.
53

If you need to have the script keep working on python2 and 3 as I did, this might help someone

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

and can then just do for example

foo = unicode.lower(foo)

1 Comment

This is the right idea, nice answer. Just to add a detail, if you are using the six library to manage Python 2/3 compatibility, you can make this: if six.PY3: unicode = str instead of sys.version_info stuff. This is also very helpful for preventing linter errors related to unicode being undefined in Python 3, without needing special linter rule exemptions.
26

You can use the six library to support both Python 2 and 3:

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

Comments

4

One can replace unicode with u''.__class__ to handle the missing unicode class in Python 3. For both Python 2 and 3, you can use the construct

isinstance(unicode_or_str, u''.__class__)

or

type(unicode_or_str) == type(u'')

Depending on your further processing, consider the different outcome:

Python 3

>>> isinstance(u'text', u''.__class__)
True
>>> isinstance('text', u''.__class__)
True

Python 2

>>> isinstance(u'text', u''.__class__)
True
>>> isinstance('text', u''.__class__)
False

Comments

2

Hope you are using Python 3 , Str are unicode by default, so please Replace Unicode function with String Str function.

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

1 Comment

that doesn't preserve BC like the answer from @atm Please consider retracting or updating your answer. There is no reason to leave python2 users behind or have breaking python3
1

If a 3rd-party library uses unicode and you can't change their source code, the following monkey patch will work to use str instead of unicode in the module:

import <module>
<module>.unicode = str

Comments

0

you can use this in python2 or python3

type(value).__name__ == 'unicode':

Comments

0

The following should work on most versions of Python, 2 or 3. There were some early versions of 3 (like 3.0) that didn't allow u'' prefixed strings, but I hope nobody's using anything that old anymore.

unicode = type(u'')

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.