簡體   English   中英

Python class 返回字典列表作為點符號

[英]Python class return list of dictionaries as dot notation

假設您在 python 中有一個 class 返回:

d=[{'source_id': '1', 'source_desc': 'XML1'},
 {'source_id': '2', 'source_desc': 'XML2'},
 {'source_id': '3', 'source_desc': 'XML3'}]

假設 class 被稱為:

class ddata():
    def __init__(var):
        self.var=method_class(var)

    def method_class(self,v):
        ´´´do stuff / dummy method´´´
        return v
        

初始化:

mydata=ddata(d)

是否可以在 python 中向 class 添加特定方法以允許以下操作:偽代碼:

mydata.1.source_desc (would be XML1)

編輯目的是一個,並且只有一個鍵用作輸入點符號。 在這種情況下,數字。 數字是 int 或 str。 並且不一定是連續的,什么使返回列表中基於 position 的解決方案無效。

可以在 Python 中使用整數作為標識符,這與@BoarGules 所說的相反。 只是不在源代碼中。 證明:

>>> class Foo: pass
>>> foo = Foo()
>>> foo.__setattr__("1", "a number!")
>>> foo.1
  File "<input>", line 1
    foo.1
        ^
SyntaxError: invalid syntax
>>> foo.__getattribute__("1")
'a number!'

所以這是一個解決方案:

from typing import Dict, List

d = [
    {'source_id': '1', 'source_desc': 'XML1'},
    {'source_id': '2', 'source_desc': 'XML2'},
    {'source_id': '3', 'source_desc': 'XML3'},
    {'source_id': 'forty_two', 'source_desc': 'XML42'}
]


class DData:
    def __init__(self, d: List[Dict[str, str]]):
        for line in d:
            source_id = line["source_id"]
            source_desc = line["source_desc"]
            self.__setattr__(source_id, source_desc)

    def __getitem__(self, item):
        return self.__getattribute__(item)


my_data = DData(d)
print(my_data["1"])  # XML1
print(my_data.forty_two)  # XML42
# print(my_data.1)  # SyntaxError: invalid syntax

我使用__getitem__因為我發現它比__getattribute__更友好。

但是只使用一個正確定義的 dict 會做同樣的事情,而且要簡單得多:

my_dict = {line["source_id"]: line["source_desc"] for line in d}
print(my_dict["1"])  # XML1
print(my_dict["forty_two"])  # XML42

我建議不要使用您無法在源代碼中編寫的標識符 ( 1 )。 而且我認為使用“字典表示法”( x["y"] )與點表示法( xy )沒有太大區別,但在您的情況下更易於維護。

暫無
暫無

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

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