如何使类函数类似于嵌套字典?

时间:2019-05-03 12:45:53

标签: python

我要做什么

我正在尝试创建一个可以存储和处理多组数据的类。

但是,我在使访问数据尽可能简单直观方面遇到麻烦。该对象实际上实质上是一个嵌套的字典,布局看起来像这样:

data = { "File1_Column1": {'header': [...],
                           'data':   [...]},
         "File1_Column2": {'header': [...],
                           'data':   [...]}, ...}

我想发生的事情

假设我有一个名为data的此类的实例,我希望data['File1_Column1']['header']data['File1_Column1']['data']返回所期望的内容,但我也希望data['File1_Column1']可以返回与data['File1_Column1']['data']相同的内容。我之所以这样,是因为我可以预见自己有99%的时间会使用数据列表,这将使它更加方便。

前两个很简单,只需使用__getitem__ 即可完成,我真的很想让后者工作。

我得到的最接近的代码显示在下面的简化代码中。我尝试以各种方式对Data类的__getitem__方法实施if语句,检查是否调用了Subscript类的__getitem__方法,但是已经没有运气。

我已经尝试过的东西

class Data:

    def __init__(self):
        self._data = {}

    def append(self, label, data):
        self._data[label] = data

    def __getitem__(self, label):

        class Subscript:

            def __init__(self, data):
                self._data = data

            def __getitem__(self, label):
                return self._data[label]

        subdata = Subscript(self._data[label])
        return subdata

data = Data()
example = {'header': ['Trace', 'Unit'], 'data': [1, 2, 3, 4]}
data.append('Label', example)
print(data['Label'])
print(data['Label']['data'])
print(data['Label']['header'])

结果

<__main__.Data.__getitem__.<locals>.Subscript object at 0x007B4B10>
[1, 2, 3, 4]
['Trace', 'Unit']

我期望发生的事情

[1, 2, 3, 4]
[1, 2, 3, 4]
['Trace', 'Unit']

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

也许您只对不同的项目使用2个字典:

headers= { "File1_Column1": ...,
            "File1_Column2": ...
            },

data  = {"File1_Column1": ..., 
          "File1_Column2": ...}

答案 1 :(得分:-1)

可以使用 repr 方法执行此操作。

您可以向Subscript类添加 repr 方法。

def __repr__(self):
    return str(self._data['data'])

这是带有repr方法的代码和一个附加示例-

class Data:

    def __init__(self):
        self._data = {}

    def append(self, label, data):
        self._data[label] = data

    def __getitem__(self, label):


        class Subscript:

            def __init__(self, data):
                self._data = data
                self.label = label

            def __getitem__(self, label):
                self.label = label
                return self._data[label]

            def __repr__(self):
                return str(self._data['data'])

        subdata = Subscript(self._data[label])
        return subdata

data = Data()
example = {'header': ['Trace', 'Unit'], 'data': [1, 2, 3, 4]}
example2 = {'header': ['Trace2', 'Unit2'], 'data': [11, 22, 33, 42]}
data.append('Label', example)
data.append('Label2', example2)
print(data['Label'])
print(data['Label']['data'])
print(data['Label']['header'])
print(data['Label2'])
print(data['Label2']['data'])
print(data['Label2']['header'])

结果(您期望发生的事情)-

Shreyashs-MacBook-Pro:~ shreyash$ python test.py 
[1, 2, 3, 4]
[1, 2, 3, 4]
['Trace', 'Unit']
[11, 22, 33, 42]
[11, 22, 33, 42]
['Trace2', 'Unit2']