为什么azure sdk for python返回对象

为什么azure sdk for python返回对象,python,azure,Python,Azure,我最近开始研究Azure的SDK,不明白为什么每个方法(由我测试)都返回一个对象,而不是更“人性化”的东西,即列表或字典 i、 e: 这似乎效率很低,无法打印另一种方法的返回值 有人能告诉我们为什么“对象列表”比“列表”更好吗?为什么不返回json之类的东西呢?简短回答:从任何实例调用as_dict()即可获得对象的dict视图 详细回答:您得到的对象不仅仅是围绕初始JSON的简单包装器。它由处理以下内容的解析生成: 多态性 类型化文字(日期时间、枚举等) XML/JSON。根据端点的内容类型

我最近开始研究Azure的SDK,不明白为什么每个方法(由我测试)都返回一个对象,而不是更“人性化”的东西,即列表或字典

i、 e:

这似乎效率很低,无法打印另一种方法的返回值


有人能告诉我们为什么“对象列表”比“列表”更好吗?为什么不返回json之类的东西呢?

简短回答:从任何实例调用
as_dict()
即可获得对象的dict视图

详细回答:您得到的对象不仅仅是围绕初始JSON的简单包装器。它由处理以下内容的解析生成:

  • 多态性
  • 类型化文字(日期时间、枚举等)
  • XML/JSON。根据端点的内容类型,无论使用何种初始媒体,对象都是相同的
对象本身包含几种方法,使其比简单的dict更复杂,例如
验证
在构建模型时验证模型是否正确(即使用实时验证构建web表单)

然而,作为消费者,Python用户和您一样喜欢dict,这就是
as_dict()
方法的目的。此方法甚至采用回调(访问者模式)来允许动态更改从该方法获得的dict序列化

(我在微软Azure SDK Python团队工作)


编辑:在
list
操作的情况下,您会得到一个Python迭代器,它免费为您处理分页。你甚至不知道什么时候取第二页。对于内存消耗,当您将其包装到
列表()
中时,您将立即加载内存中的所有内容。如果在compute\u client.virtual\u machines.list\u all()中为vm使用
,则内存中一次只能有一个页面,不能有更多页面。如果您只需要几个对象,那么如果您有很多虚拟机可以利用迭代器(无论是使用
for
循环还是
next()
StopIteration
异常)

感谢您给出了为什么使用对象的答案。关于您的
只需调用为_dict()
,我需要从某处导入它还是需要将一个新方法
定义为_dict()
?该方法位于所有返回的对象上:
用于compute\u client.virtual\u machines中的vm。list\u all():print(vm.as\u dict())
。详细信息:
list(compute_client.virtual_machines.list_all())
[<azure.mgmt.compute.compute.v2017_03_30.models.virtual_machine.VirtualMachine object at 0x7f637f93c190>, <azure.mgmt.compute.compute.v2017_03_30.models.virtual_machine.VirtualMachine object at 0x7f637f93c750>, <azure.mgmt.compute.compute.v2017_03_30.models.virtual_machine.VirtualMachine object at 0x7f637f93cad0>, <azure.mgmt.compute.compute.v2017_03_30.models.virtual_machine.VirtualMachine object at 0x7f637f93ced0>]
def print_item(group):
    """Print a ResourceGroup instance."""
    print("\tName: {}".format(group.name))
    print("\tId: {}".format(group.id))
    print("\tLocation: {}".format(group.location))
    print("\tTags: {}".format(group.tags))
    print_properties(group.properties)