【问题标题】:Python class return list of dictionaries as dot notationPython类以点表示法返回字典列表
【发布时间】:2021-11-18 22:31:23
【问题描述】:

假设你在 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。并且不一定是连续的,根据返回列表中的位置使解决方案无效。

【问题讨论】:

标签: python class


【解决方案1】:

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

我使用__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)。而且我认为使用“dict notation”(x["y"])与点表示法(x.y)没有太大区别,但在您的情况下更容易维护。

【讨论】:

  • 另外,我建议您选择使用数字或数字名称,而不是同时使用两者。
猜你喜欢
  • 1970-01-01
  • 2018-07-08
  • 2018-02-06
  • 2019-08-26
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
相关资源
最近更新 更多