urllib.urlencode не любит значения Юникода: как насчет этого обходного пути?

Если у меня есть объект вроде:

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...

Спасибо!

48
задан 25 June 2011 в 21:56
поделиться