簡體   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