如何用字典表示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
相关产品推荐
相关产品推荐

