我在运行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似乎有可能覆盖默认值。
我该如何解决这个问题?
答案 0 :(得分:2)
实施您自己的urlencode()
功能。 urllib.parse.urlencode()
library function主要包含测试,以确保可以处理bytes
和str
个对象,以及处理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