簡體   English   中英

object 個變量的 try/except 設置的 Pythonic 方式

[英]Pythonic way of try/except setting of object variables

我正在編寫一些代碼,這些代碼接受字典並創建一個 object 的實例。在學習tryexcept塊時,我已將它合並到我的小 function 中。我已經准備好多次檢查之前做某事不是 Pythonic,所以我想知道我將如何更改我的代碼(如下)以滿足該建議。 就目前而言,代碼之所以有效,是因為我在設置之前使用了getattr 否則, setattr將創建屬性而不是因為屬性不存在而失敗。

class Gem:
    def __init__(self):
        self.name = None
        self.val = None
        
class Rock:
    def __init__(self):
        self.name = None
        self.weight = None
        
def create_objects(data):
    obj_list = []
    for i in data:
        new_obj = Gem()
        try:
            for k, v in i.items():
                getattr(new_obj, k)
                setattr(new_obj, k, v)
            obj_list.append(new_obj)
        except:
            print("Fail")
    return obj_list

data_list = [
    {"name": "Star", "val": 5},
    {"name": "Square", "val": 1},
    {"name": "Granite", "weight": 50}
]

obj_list = create_objects(data_list)

for o in obj_list:
    for k, v in vars(o).items():
        print(k, v)

要在創建實例時設置屬性,請將它們作為 arguments 傳遞給__init__ 這樣,您可以確定它們還不存在,並且您不需要try / except

class Gem:
    def __init__(self, name, val):
        self.name = name
        self.val = val

obj_list = []
for gem_attributes in data_list:
    gem = Gem(gem_attributes['name'], gem_attributes['val'])
    obj_list.append(gem)

將字典值傳遞為 arguments 與鍵同名可以使用**參數解包語法縮短:

gem = Gem(**gem_attributes)

整個列表創建可以簡化為列表理解:

obj_list = [
    Gem(**gem_attributes)
    for gem_attributes in data_list
]

作為一個額外的並發症,你有不同的 object 類型。

為了在同一個循環中同時創建GemRock對象,我建議將 object 類型顯式添加到輸入數據中,而不是依賴屬性名稱來區分它們:

data_list = [
    ('Gem', {'name': 'Star', 'val': 5}),
    ...
    ('Rock', {'name': 'Granite', 'weight': 50})
]

obj_list = []
for obj_type, obj_attributes in data_list:
    obj_class = {'Gem': Gem, 'Rock': Rock}[obj_type]
    obj_list.append(obj_class(**obj_attributes))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM