Если у меня есть объект вроде:
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
мне кажется очень шаткой. Во-первых, он не обрабатывает вложенные объекты.
Во-вторых, я нервничаю по поводу этого оператора if. Есть ли еще какие-то типы, которые мне следует учитывать?
И сравнивает ли type ()
чего-либо с собственным объектом, как это хорошая практика?
type(v) in (str, unicode) # not so sure about this...
Спасибо!