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
您可以将您的属性作为 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
并创建自定义数据类,您可以这样做:
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
对于 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}