2012-03-13 59 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