Python:导入urllib.quote


109

我想用urllib.quote()。但是python(python3)找不到模块。假设我有以下代码行:

print(urllib.quote("châteu", safe=''))

如何导入urllib.quote?

import urllibimport urllib.quote两者都给

AttributeError: 'module' object has no attribute 'quote'

令我困惑的urllib.request是可以通过以下方式访问import urllib.request

Answers:



54

如果您需要同时处理Python 2.x和3.x,则可以捕获异常并加载替代项。

try:
    from urllib import quote  # Python 2.X
except ImportError:
    from urllib.parse import quote  # Python 3+

您还可以使用python兼容性包装器6来处理此问题。

from six.moves.urllib.parse import quote

您应该更具前瞻性。假设python3和2.7除外。尝试:将urllib.parse导入为urlparse,除了ImportError:从urlparse导入urlparse#python 2.7.11
林肯·兰德尔·麦克法兰

@LincolnRandallMcFarland您正在谈论的是这样不相关的微优化。将来在项目中完全放弃对Python 2.X的支持变得越来越困难。
eandersson

如果您只想因为...而将抛出和捕获异常作为您最常见用例的标准导入过程,那不是我的工作时间循环而已,但是您知道自己在做什么:异常应该是特殊的。这是使其工作与使其更好之间的区别。
林肯·兰德尔·麦克法兰

这是没有意义的讨论。两者都是有效的...如果您捕获了Python 3异常,然后尝试导入Python 2.7库,但是由于某种原因,两者都丢失了,抛出的异常将表明它缺少Python 2.7库。非常混乱。实际上,如果您非常关心异常,则有更好的方法来处理此异常,例如六个或检查Python版本而不是依赖异常。但是实际上,如果您非常关心毫无意义的事情,则根本不应该保持Python 2的向后兼容性,因为无论如何它今年都是EOL。
eandersson


4

这就是我在不使用异常的情况下的处理方式。

import sys
if sys.version_info.major > 2:  # Python 3 or later
    from urllib.parse import quote
else:  # Python 2
    from urllib import quote
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.