Python 3如何在Python 3.4.2中解决urllib.parse.urlencode缺少quote_via的问题

时间:2017-02-25 18:40:26

标签: python python-3.4 urllib urlencode

我在运行Python 3.5.2的机器上创建了一个Python脚本。现在我想在另一台运行Python 3.4.2的计算机上运行它,我无法在那里升级Python。 我的问题是我用过

urllib.parse.urlencode(dict, safe='/', quote_via=urllib.parse.quote)

在Python 3.4.2中,quote_via选项显然不可用,因此我收到错误

TypeError: urlencode() got an unexpected keyword argument 'quote_via'

我需要在此处对字典dict进行urlencode,只使用quote()而不是quote_plus(),这是3.4和3.5中的默认值。但是,只有3.5似乎有可能覆盖默认值。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

实施您自己的urlencode()功能。 urllib.parse.urlencode() library function主要包含测试,以确保可以处理bytesstr个对象,以及处理doseq标记。

否则,它只是一个循环编码每个键的键和值,在它们之间添加=并将所有这些对与&连接起来。为您的输入实现相同的循环,并对您需要的变体进行硬编码。

您可以使用以下方式复制您的特定行为:

'&'.join(['{}={}'.format(quote(k, safe='/'), quote(v, safe='/'))
          for k, v in dict.items()])

答案 1 :(得分:1)

肮脏的黑客方法:)

import urllib.parse
import sys
major, minor, _, _, _ = sys.version_info
if major == 3 and minor < 5:
    urllib.parse.quote_plus = urllib.parse.quote

更新:稍微不那么脏:

class MonkeyPatchQuote(object):
    def __init__(self):
        major, minor, _, _, _ = sys.version_info
        self.should_patch = major == 3 and minor < 5

    def __enter__(self):
        if self.should_patch:
            self.original_handler = urllib.parse.quote_plus
            urllib.parse.quote_plus = urllib.parse.quote

    def __exit__(self, *args):
        if self.should_patch:
            urllib.parse.quote_plus = self.original_handler