Если у меня есть объект вроде:
d = {'a':1, 'en': 'hello'}
... тогда я могу передать его urllib.urlencode
, без проблем:
percent_escaped = urlencode(d)
print percent_escaped
Но если я попытаюсь передать объект со значением типа unicode
, игра завершена:
d2 = {'a':1, 'en': 'hello', 'pt': u'olá'}
percent_escaped = urlencode(d2)
print percent_escaped # This fails with a UnicodeEncodingError
Итак, мой вопрос о надежном способе подготовки объекта к urlencode
.
Я придумал эту функцию, где я просто перебираю объект и кодирую значения типа string или unicode:
def encode_object(object):
for k,v in object.items():
if type(v) in (str, unicode):
object[k] = v.encode('utf-8')
return object
Это работает:
d2 = {'a':1, 'en': 'hello', 'pt': u'olá'}
percent_escaped = urlencode(encode_object(d2))
print percent_escaped
И это выводит a=1&en=hello&pt=%C3%B3la
, готовый для передачи на вызов POST или что-то еще.
Но моя функция encode_object
выглядит очень шаткой для меня. Во-первых, он не обрабатывает вложенные объекты.
С другой стороны, я нервничаю из-за этого заявления. Существуют ли какие-либо другие типы, которые я должен учитывать?
И сравнивает type()
что-то с нативным объектом, как эта хорошая практика?
type(v) in (str, unicode) # not so sure about this...
Спасибо!