Если у меня есть объект вроде:
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...
Спасибо!