NameError:全局名称“ unicode”未定义-在Python 3中


136

我正在尝试使用一个名为bidi的Python包。在此程序包(algorithm.py)的模块中,尽管它是程序包的一部分,但仍有一些行会给我带来错误。

以下是这些行:

# 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

这是错误消息:

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中使用?另外,如果有人在Python 3中使用了bidi软件包,请让我知道他们是否发现了类似的问题。我感谢您的帮助。

Answers:


213

Python 3将unicode类型重命名为str,旧str类型已替换为bytes

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

您可能需要阅读Python 3 porting HOWTO以获得更多此类详细信息。还有Lennart Regebro的“ 移植到Python 3:深入指南”,可免费在线获得。

最后但并非最不重要的一点是,您可以尝试使用该2to3工具查看如何为您翻译代码。


那我应该写:if isinstance(unicode_or_str,str)吗?unicode_or_str怎么样?
TJ1 2013年

1
变量名在这里没有多大关系;if isinstance(unicode_or_str, str)应该工作。重命名变量名称是可选的。
马丁·彼得斯

5
@ TJ1:请确保您没有删除右括号或其他地方。该代码应该只是罚款与刚刚 unicode替换成str
马丁·皮特斯

您是对的Martijn,我忘记了:在我的代码中,感谢您的帮助,它现在可以正常工作。
TJ1 2013年

我喜欢2to3工具
ji-ruh

22

如果您需要让脚本像我一样继续在python2和3上工作,这可能会对某人有所帮助

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

然后可以例如

foo = unicode.lower(foo)

1
这是正确的想法,很好的答案。仅添加一个细节即可,如果您正在使用该six库来管理Python 2/3兼容性,则可以使用:if six.PY3: unicode = str代替sys.version_info东西。这对于防止与Python 3中未定义的unicode相关的linter错误(不需要特殊的linter规则豁免)也非常有帮助。
伊利

20

您可以使用6个库同时支持Python 2和3:

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

1

希望您使用的是Python 3,默认情况下Str是unicode,所以请Unicode用String Str函数替换函数。

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

2
不会像@atm那样保留BC,请考虑收回或更新您的答案。没有理由将python2用户留在后面或破坏python3
MrMesees
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.