Python类以点表示法返回字典列表

2024-05-26 16:29:50 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有一个python类返回:

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

假设该类被称为:

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中,是否可以向类中添加特定方法以允许以下操作: 伪代码:

mydata.1.source_desc (would be XML1)

编辑 其目的是使用一个键,并且只使用其中一个键作为输入点符号。在这种情况下,数字是正确的。数字是int或str,不一定是连续的,这会根据返回列表中的位置使解决方案无效


Tags: selfidsourceinitvardef数字do
1条回答
网友
1楼 · 发布于 2024-05-26 16:29:50

与@BoarGules所说的相反,在Python中可以使用整数作为标识符。只是不在源代码中。证明:

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

我使用了^{},因为我发现它比__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)。我认为使用“dict表示法”(x["y"])与点表示法(x.y)没有太大区别,但在您的例子中,维护起来要简单得多

相关问题 更多 >

    热门问题