You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用字典表示Zeep中base64Binary扩展类型的Files元素?

Zeep中如何表示带属性的base64Binary扩展类型

问题背景

给定XML元素定义:

<xs:element name="Files" maxOccurs="unbounded">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:base64Binary">
                <xs:attribute name="id" type="xs:anyURI" use="required" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

需要构建字典request_data传入Zeep的Client生成SOAP信封,但尝试用base64Binary作为键名的写法会报错:

request_data = {
    # 其他数据
    "Files": [
        {
             "base64Binary": encoded_file,
             "id": "123"
        },
    ]
}

报错信息:

TypeError: Files() got an unexpected keyword argument 'base64Binary'. Signature: `xsd:base64Binary, id: xsd:anyURI`

解决方案

从报错的签名可以看出,Zeep将这种simpleContent扩展的类型处理为基础值作为位置参数,属性作为关键字参数,不需要用字典包裹基础值,而是直接把base64编码后的内容作为第一个值,属性id作为关键字参数传入。

方式一:使用元组(匹配签名的位置+关键字参数形式)

request_data = {
    # 其他数据
    "Files": [
        (encoded_file, {"id": "123"}),
    ]
}

方式二:调用Zeep生成的类型构造器(更直观)

先获取Files类型,再构造实例:

files_type = client.get_type('ns0:Files')
request_data = {
    # 其他数据
    "Files": [
        files_type(encoded_file, id="123"),
    ]
}

原理说明

当XML类型是simpleContent扩展基础类型时,Zeep不会把基础值当作字典的键,而是将其作为构造函数的第一个位置参数,属性则作为关键字参数。之前的写法错误地把基础值包装成了字典键值对,不符合Zeep的类型签名要求。

内容的提问来源于stack exchange,提问作者Krzysiek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:42:32