2012-03-13 60 views
2

我之前从未遇到过使用过泡沫的问题,直到我点击了这个WSDL。 (这只是导致问题的部分)python 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?

感谢

回答

0

泡沫接口转换这些枚举到对象属性,和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) ,如果是的话,使用 unidecode将标识符转换为ascii并跟踪原始名称。
  • 转换回Unicode版本生成的SOAP消息

我从来没有尝试过使用Python 3 *泡沫的时候,但它支持在标识符名称Unicode字母。

我的本地习语是葡萄牙语,在这个WSDL中有很多重音字符,比如法语。即使Python 3. *允许,我认为使用除英文标识符之外的任何内容都没有令人信服的理由 - 这是一个愚蠢的想法,接口作者正在寻求麻烦。 SOAP背后的整个理念是互操作性,为什么使用所有编程语言都不支持的功能?

+0

感谢Paulo,你确认我的恐惧。我在玩e.name和decode(),但是当它工作时,它找不到“Numérique”了。我不想转换它,所以我写在这里.. – LeSuspect 2012-03-13 16:20:25

+0

@ user112342:对不起,听到这一点。你很急吗?可能是我可以为你修复它,我可以通过Internet URL访问这个Web服务吗? – 2012-03-13 16:59:24

+0

不错,你提供,但它的密码保护......虽然谢谢! – LeSuspect 2012-03-13 17:28:19