如何使自定义数据类可订阅?

问题描述 投票:0回答:2

考虑从

pydantic
包派生的数据类:

from typing import List
from pydantic import BaseModel 


class Bucket(BaseModel):
    setting: List[str]
    fight_1: List[int]
    cause_1: List[str]

my_bucket
成为
Bucket
的实例:

my_bucket = Bucket(setting=['some_value'], fight_1=[0], cause_1=['other_value'])

基本上我希望能够做到

my_bucket['setting']                                                                                                         

然后回来

['some_value']
,但我得到的是:

---------------------------------------------------------------------------
TypeError                                 
Traceback (most recent call last)
<ipython-input-18-cacbdc1698e9> in <module>
----> 1 my_bucket['setting']

TypeError: 'Bucket' object is not subscriptable
python-3.x pydantic
2个回答
28
投票

带 pydantic

您可以将您的属性作为 pydantic 中的属性进行访问。

my_bucket = Bucket(setting=['some_value'], fight_1=[0], cause_1=['other_value'])
print(my_bucket.setting)  # ['some_value']

如果想使用

[]
来访问,需要定义
__getitem__
:

from typing import List
from pydantic import BaseModel


class Bucket(BaseModel):
    setting: List[str]
    fight_1: List[int]
    cause_1: List[str]

    def __getitem__(self, item):
        return getattr(self, item)


my_bucket = Bucket(setting=['some_value'], fight_1=[0], cause_1=['other_value'])
print(my_bucket['setting'])  # ['some_value']

无 pydantic

如果您不想使用

pydantic
并创建自定义数据类,您可以这样做:

from dataclasses import dataclass


@dataclass
class CustomDataClass:
    data: int

    def __getitem__(self, item):
        return getattr(self, item)


obj = CustomDataClass(42)
print(obj.data)  # 42
print(obj["data"])  # 42, needs __getitem__ to be implemented

4
投票

对于 python 数据类,这对我有用:

from dataclasses import dataclass

@dataclass
class MyCustomRequest:
    request: Dict
        
    def __getitem__(self, key):
        return super().__getattribute__(key)
>>> a = MyCustomRequest({"a":10})
>>> a["request"]
{"a":10}
>>> a.request
{"a": 10}
© www.soinside.com 2019 - 2024. All rights reserved.