python suds - WSDL содержит значения перечисления с ударением - PullRequest
2 голосов
/ 13 марта 2012

У меня никогда не было проблем с использованием suds, пока я не включил этот WSDL.(это только та часть, которая вызывает проблемы)

<s:simpleType name="ProductFormat">
   <s:restriction base="s:string">
      <s:enumeration value="Papier"/>
      <s:enumeration value="Numérique"/>
      <s:enumeration value="PapierEtNumérique"/>
   </s:restriction>
</s:simpleType>

Как видите, в значениях есть акценты, и гудит, когда я пытаюсь создать: suds:

product_format = self.client.factory.create('ProductFormat')

Этоконец трассировки:

File "/home/andre/Documents/archambault/apps/onix/management/commands/import_sogides_onix.py", line 58, in get_catalog
    product_format = self.client.factory.create('ProductFormat')
  File "/home/andre/Documents/archambault/envs/lib/python2.6/site-packages/suds/client.py", line 240, in create
    setattr(result, e.name, e.name)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 3: ordinal not in range(128)

Похоже, что Suds не нравится "é" Numérique (позиция 3).насколько вам известно, есть ли способ избежать редактирования client.py?

спасибо

1 Ответ

0 голосов
/ 13 марта 2012
Интерфейс

suds преобразует эти перечисления в атрибуты объекта, а Python 2. * не позволяет использовать символы Юникода для имен идентификаторов.В Python 3.2 это работает:

>>> class A(object):
        pass

>>> a = A()
>>> setattr(a, 'tést', 1)
>>> a.tést
1

В Python 2.6 это вызывает UnicodeEncodeError:

>>> setattr(a, u'tést', 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal not in range(128)

Исправление этого для Python 2. * кажется большой работой:

  • проверьте, если e.name != unidecode(e.name), если это так, конвертируйте идентификаторы в ascii, используя unidecode, и отслеживайте исходное имя.
  • конвертируйте обратно в версию Unicode при генерации мыльных сообщений

Я никогда не пробовал suds с Python 3. *, но он поддерживает буквы юникода в именах идентификаторов.

Моя родная идиома - португальский, в нем много акцентированных символов, таких как французы в этом WSDL.Даже если Python 3. * допускает это, я думаю, что нет веских причин для использования чего-либо, кроме английских идентификаторов - это глупая идея, и автор интерфейса напрашивается на неприятности.Вся идея SOAP заключается в совместимости, зачем использовать функцию, которая не очень хорошо поддерживается всеми языками программирования?

...