鸭子打字和异物
Duck typing and foreign objects
我目前正在复制与这个问题类似的内容:python switch by class name?
我有一个 for 循环,它遍历一组对象并将它们按类型分类到多个列表中的一个。
for obj in list_of_things:
if isinstance(obj, Class1):
class1list.append(obj)
if isinstance(obj, Class2):
class2list.append(obj)
等对于其他几个 classes。该应用程序类似于 ORM - 来自每个 class 的数据将被提取并写入数据库,每个 class 都有不同的数据要提取。此外,有必要在 Class2 的任何实例之前由 ORM 处理 Class1 的所有实例。
最后,Class1 和 Class2 不是我的 - 它们是我正在使用的 API 的输出,所以我无法按照上一个问题中的建议更改它们(例如,编写一个 serialize() 方法,在每个 class) 中转储我需要的数据。我向 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
测试,您只需 "group by" 每个对象的类型。
您可以使用 class 名称作为键来访问字典的值:
print(obj_map[int]) # [2, 3]
我目前正在复制与这个问题类似的内容:python switch by class name?
我有一个 for 循环,它遍历一组对象并将它们按类型分类到多个列表中的一个。
for obj in list_of_things:
if isinstance(obj, Class1):
class1list.append(obj)
if isinstance(obj, Class2):
class2list.append(obj)
等对于其他几个 classes。该应用程序类似于 ORM - 来自每个 class 的数据将被提取并写入数据库,每个 class 都有不同的数据要提取。此外,有必要在 Class2 的任何实例之前由 ORM 处理 Class1 的所有实例。
最后,Class1 和 Class2 不是我的 - 它们是我正在使用的 API 的输出,所以我无法按照上一个问题中的建议更改它们(例如,编写一个 serialize() 方法,在每个 class) 中转储我需要的数据。我向 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
测试,您只需 "group by" 每个对象的类型。
您可以使用 class 名称作为键来访问字典的值:
print(obj_map[int]) # [2, 3]