gpt4 book ai didi

python - 如何输入提示动态类实例化,如 pydantic 和数据类?

转载 作者:行者123 更新时间:2023-12-01 22:52:34 30 4
gpt4 key购买 nike

Pydantic 和 Dataclass 都可以根据属性及其类型来类型提示对象创建,如下例所示:

from pydantic import BaseModel, PrivateAttr, Field
from dataclasses import dataclass

# Pydantic way
class Person(BaseModel):

name : str
address : str
_valid : bool = PrivateAttr(default=False)


#dataclass way
@dataclass
class PersonDataclass():

name : str
address : str
_valid : bool = False

bob = Person(name="Bob", address="New York")

bobDataclass = PersonDataclass("Bob", "New York")

使用这段代码,我可以获得有关对象创建的类型提示(请参见下面的屏幕截图):

pydantic typehint on object creation

dataclass typehint on object creation

不仅如此,对象的属性也得到记录。


我研究了 pydantic 的代码试图达到相同的结果,但我做不到。我试过的代码是这样的:

class MyBaseModelMeta(type):

def __new__(cls, name, bases, dct):

def new_init(self : cls, /, name : str, address : str):
self.name = name
self.address = address
self._valid = False

dct["__init__"] = new_init
dct["__annotations__"] = {"__init__": {"name": str, "address": str, "_valid": bool}}
return super().__new__(cls, name, bases, dct)


class MyBaseModel(metaclass=MyBaseModelMeta):

def __repr__(self) -> str:
return f"MyBaseModel: {self.__dict__}"


class MyPerson(MyBaseModel):
pass

myBob = MyPerson("Bob", "New York")

我的类有效(动态 init 插入有效)但类和对象没有类型提示。

my class works but it doesn't get typehinted

我做错了什么?如何实现类型提示?

最佳答案

@Daniil Fajnberg 大部分是正确的,

但根据您的类型检查器,您可以使用 dataclass_transform(Python 3.11)

__dataclass_transform__ early adopters program装饰器。

Pylance 和 Pyright(通常在 VS-Code 中使用)至少可以使用这些。

虽然您只能通过这种方式模仿数据类的行为,但我认为您无法定义您的元类添加 额外字段。 :/

编辑:至少 pydantic 将这个装饰器用于他们的 BaseModel:https://pydantic-docs.helpmanual.io/visual_studio_code/#technical-details

如果你深入研究 pydantic 的代码,你会发现他们的 ModelMetaclass 装饰有 __dataclass_transform__

关于python - 如何输入提示动态类实例化,如 pydantic 和数据类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73987319/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com