Список всех возможных значений для перечисления 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 самостоятельно.

<Сильного> Edit: Я нашел способ, чтобы получить перечисления данных имени simpleType, как показано ниже, так что мои проблемы сужают к findingthe имени типа для данного переменного, при условии, что тип (х) возвращает мыльной пена. sax.text.Text вместо настоящего имени

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

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


Ответы (3)


Если вы знаете, имя из перечисления вы хотите, вы должны быть в состоянии обработать объект перечисления пены дает вам как словарь, и сделать прямой поиск с этим именем. Например, если ваш тип перечисления называется SOAPIPMode, и вы хотите, перечисление с именем 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

Я понял, а Hacky способ осуществить это, но, надеюсь, кто-то еще лучший ответ для меня. По какой-то причине объектов возвращаются с сервера имеют перечисления с типом suds.sax.text.Text, но те, которые создаются с заводом имеют типов, связанные с перечислением, так это работает:

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