python suds - WSDL包含带重音的枚举值

时间:2012-03-13 14:18:40

标签: python utf-8 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>

正如你所看到的,当我尝试创建时,值和口音中都有重音符号:

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 :(得分:0)

suds接口将这些枚举转换为对象属性,而Python 2. *不允许使用unicode字形作为标识符名称。在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并跟踪原始名称。
  • 生成soap消息时转换回unicode版本

我从未尝试使用Python 3. *,但它支持标识符名称中的unicode字母。

我的母语成语是葡萄牙语,在这个WSDL中有许多像法语一样的重音字符。即使Python 3. *允许这样做,我认为使用除英文标识符之外的任何东西都没有令人信服的理由 - 这是一个愚蠢的想法,界面作者正在寻找麻烦。 SOAP背后的整个思想是互操作性,为什么要使用所有编程语言都不支持的功能呢?