urllib.parse.quote 有幂等版本吗?

Is there an idempotent version of urllib.parse.quote?

有 urllib.parse.quote 的幂等版本吗?该函数应满足:

urllib.parse.quote(x) == urllib.parse.quote(urllib.parse.quote(x))

足够宽的一组 x 字符串。

如果我在逗号上测试函数,例如:

x = urllib.parse.quote(",")
y = urllib.parse.quote("x")

然后我得到 x = '%2C' 但是 y = '%252C' 所以它对于逗号不是幂等的。

如果不存在这样的功能,您能描述一下实现吗? 我在考虑使用:

my_unquote = lambda x: urllib.parse.quote(urllib.parse.unquote(x)) 但不确定这是否正确。

问题来自处理已部分编码的网址。

URL-encoding本质上是一个非幂等操作,因为%符号既是一段需要编码的输入,也是输出编码的一个组成部分(见table here)。这意味着大多数(任何?)URL 编码的字符串将包含将在未来的编码过程中重新编码的字符 (%)。

换句话说,不可能仅仅通过检查字符串本身就知道给定的字符串是否已经过 URL 编码。这使得编写幂等编码函数变得困难,甚至是不可能的。

根据您的用例,您可能可以使用特定于域的解决方法来模拟幂等性。例如,如果您知道给定 URL 的路径部分已被编码但方案没有,您可以 运行 仅对方案进行编码。