Изброяване на всички възможни стойности за SOAP изброяване с Python SUDS

Свързвам се със SUDS клиент към SOAP сървър, чийто wsdl съдържа много изброявания като следното:

</simpleType>
  <simpleType name="FOOENUMERATION">
  <restriction base="xsd:string">
   <enumeration value="ALPHA"><!-- enum const = 0 -->
   <enumeration value="BETA"/><!-- enum const = 1 -->
   <enumeration value="GAMMA"/><!-- enum const = 2 -->
   <enumeration value="DELTA"/><!-- enum const = 3 -->
  </restriction>
</simpleType>

В моя клиент получавам последователности, които съдържат елементи от тези различни типове изброяване. Имам нужда от дадена членска променлива, трябва да знам всички възможни стойности за изброяване. По принцип имам нужда от функция, която взема екземпляр на едно от тези преброявания и връща списък от низове, които са всички възможни стойности.

Когато имам екземпляр, стартиран:

print type(foo.enumInstance)

Взимам:

<class 'suds.sax.text.Text'>

Не съм сигурен как да получа действителното име на simpleType от това и след това да получа възможните стойности от това, без сам да анализирам WSDL.

Редактиране: Открих начин да получа изброяванията с името simpleType, както е показано по-долу, така че проблемът ми се свежда до намиране на името на типа за дадена променлива, като се има предвид, че type(x) връща suds. sax.text.Текст вместо истинското име

 for l in  client.factory.create('FOOENUMERATION'):
    print l[0]

person bdk    schedule 12.06.2010    source източник


Отговори (3)


Ако знаете името на enum, което искате, трябва да можете да третирате обекта за изброяване, който suds ви дава като речник, и да направите директно търсене с това име. Например, ако вашият тип изброяване се нарича SOAPIPMode и искате enum с име STATIC_MANUAL в това изброяване:

soapIPMode = client.factory.create('SOAPIPMode')
staticManual = soapIPMode['STATIC_MANUAL']

Получената стойност е от тип suds.sax.text.Text, която действа като низ.

Можете също така да обхождате типа изброяване, сякаш е масив:

for i in range(len(soapIPMode):
    process(soapIPMode[i])
person Poulsbo    schedule 16.02.2011

Измислих доста хакерски начин да направя това, но се надявам, че някой все пак има по-добър отговор за мен. По някаква причина обектите, върнати от сървъра, имат enum с тип suds.sax.text.Text, но тези, създадени с фабриката, имат типове, свързани с enum, така че това работи:

def printEnums(obj,field):
     a=client.factory.create(str(getattr(client.factory.create( str(obj.__class__).replace('suds.sudsobject.','')),field).__class__).replace('suds.sudsobject.',''))
     for i in a:
         print i[0]

Тогава мога да направя:

 printEnums(foo,'enumInstance')

и дори ако foo е върнат от сървъра и не е създаден от фабрика, получавам списък с възможните стойности за foo.enumInstance, тъй като фабрично създавам нов клас от същия тип като този, който е предаден. Все пак не мога представете си, че тази бъркотия е правилният/най-добрият начин да направите това.

person bdk    schedule 12.06.2010

Вижте дали можете да подадете WSDL в компонента ElementTree на Python и да го използвате, за да получите изброяванията.

person Khorkrak    schedule 12.06.2010