Существует ли идемпотентная версия urllib.parse.quote? - PullRequest
1 голос
/ 30 марта 2019

Существует ли версия 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, которые были частично закодированы.

1 Ответ

3 голосов
/ 30 марта 2019

URL-кодирование является по своей природе неидемпотентной операцией, потому что знак % является одновременно частью ввода, которую необходимо кодировать, и компонентом кодирования вывода (см. Таблицу здесь ).,Это означает, что большинство (любых?) Строк в кодировке URL будут содержать символы (%), которые будут перекодированы будущим этапом кодирования.

Другими словами, невозможно узнать, является ли данныйстрока уже была закодирована в URL или нет, просто проверяя саму строку.Это усложняет написание функции идемпотентного кодирования, а может быть и невозможна.

В зависимости от вашего варианта использования, существуют вероятные обходные пути для конкретной области, которые вы можете использовать для симуляции идемпотентности.Например, если вы знали, что часть пути данного URL-адреса была закодирована, а схема - нет, вы можете выполнить кодирование только на схеме.

...