繁体   English   中英

鸭打字和外来物

[英]Duck typing and foreign objects

我正在复制类似于这个问题的东西: python按类名切换?

我有一个for循环,迭代一组对象,并按类型将它们分类到几个列表中的一个。

for obj in list_of_things:
    if isinstance(obj, Class1):
        class1list.append(obj)
    if isinstance(obj, Class2):
        class2list.append(obj)

等几个其他类。 应用程序类似于ORM - 每个类的数据将被提取并写入数据库,每个类都有不同的数据要提取。 此外,必须在Class2的任何实例之前由ORM处理Class1的所有实例。

最后,Class1和Class2不是我的 - 它们是我正在使用的API的输出,所以我无法像上一个问题中建议的那样更改它们(比如,编写一个转储序列化()的方法我需要的每个课程的数据)。 我向API请求了一些对象,它让我充满了各种类型的对象,我需要从中提取不同的数据。

有更多的pythonic方式吗? 这种方法满足了需要,但它伤害了我的眼睛,我想学习更好的方法。 我仍然是Python的新手。

根据您的具体情况,另一种方法可能会使用type类型不可变的事实,因此可以用作字典键。

所以你可以这样做:

from collections import defaultdict

list_of_things = [2, 3, "Some", "String"]

obj_map = defaultdict(list)    
for obj in list_of_things:
    obj_map[type(obj)].append(obj)

print(obj_map)

输出:

defaultdict(<type 'list'>, {
    <type 'int'>: [2, 3], 
    <type 'str'>: ['Some', 'String']
})

这里的想法是你不需要编写一大堆if isinstance测试,你只需要“分组”每个对象的类型。

您可以使用类名作为键来访问字典的值:

print(obj_map[int])    # [2, 3]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM