0

Iterable 和 Array 类型似乎都隐藏了一个原生列表,但我发现自己总是在做类似的事情:

myList = service.fetchRemoteList()[0][1] 

在哪里fetchRemoteList() _returns=Iterable(String)

我不想将 [0][1] 放在所有列表函数调用的末尾。

4

2 回答 2

2

Spyne 默认使用包装数组,因为 XML 世界中的其他人都是这样做的。

包装数组:

<users>
    <User>
        <id>1</id>
        <name>Batman</name>
    </User>
    <User>
        <id>2</id>
        <name>Robin</name>
    </User>
</users>

裸数组:

<users>
    <id>1</id>
    <name>Batman</name>
</users>
<users>
    <id>2</id>
    <name>Robin</name>
</users>

您可能会明白为什么现在每个人都更喜欢包装数组了。这是一个惯例问题,但肯定是一个有用的问题。另外,不可能对非包装数组进行多态性。

Spyne 默认也使用包装函数,因为在裸模式下不可能有多个参数/返回值。

现在答案:

  • 这是一个包装的数组:

    Array(Unicode)
    

    这是等效的裸数组:

    Unicode(max_occurs='unbounded')
    

    在 2.12 中,还可以传递wrapped=False给 Array 来获取裸数组。例如。:

    Array(Unicode, wrapped=False)
    
  • 正如您所发现的,您可以将裸函数传递_body_style='bare'@rpc.

一些 SOAP 客户端通过简单的启发式方法发现它是什么类型的函数/数组,从而为您省去了使用魔法索引的麻烦。显然泡沫不是其中之一。

于 2015-07-03T10:08:56.777 回答
-1

在讨论数组时,这至少需要在网站上记录,或者更现实地说,这需要按照“最小惊讶原则”作为默认行为。

很难找到以下划线开头的小变量,您可以使用称为“_body_style”的变量,当设置为字符串文字“bare”时,它似乎可以正常工作:

@srpc(_returns=Array(String),_body_style='bare')    
def fetchRemoteList():
    yield "Item1"
    yield "Item2"
于 2015-07-02T00:22:18.347 回答