小编Dan*_*erg的帖子

如何输入提示函数,通过Python中的类装饰器添加到类中

我有一个类装饰器,它向装饰类添加了一些函数和字段。

@mydecorator
@dataclass
class A:
    a: str = ""
Run Code Online (Sandbox Code Playgroud)

添加(通过setattr())是一个.save()函数和一组数据类字段的信息作为单独的字典。

我希望 VScode 和 mypy 能够正确识别这一点,以便当我使用时:

a=A()
a.save()
Run Code Online (Sandbox Code Playgroud)

或者a.my_fields_dict这两个被正确识别。

有什么办法可以做到这一点吗?也许A在运行时修改类类型注释?

dynamic type-hinting python-3.x python-decorators python-typing

11
推荐指数
1
解决办法
1341
查看次数

Pydantic 模型字段与 Typing.Optional[] 与 Typing.Optional[] = None

创建Pydantictyping.Optional[]模型时隐式将可选属性设置为 None与显式分配之间有什么区别?在这两种情况下,属性最终都会在类对象实例化时具有一个值。typing.Optional[] = NoneNone

import typing
import pydantic


class Bar(pydantic.BaseModel):
    a: typing.Optional[int]

    @pydantic.validator('a', always=True, pre=True)
    def check_a(cls, v, values, field):
        print("WITHOUT NONE")
        print(values)
        print(field)
        return v


class Baz(pydantic.BaseModel):
    a: typing.Optional[int] = None

    @pydantic.validator('a', always=True, pre=True)
    def check_a(cls, v, values, field):
        print("WITH NONE")
        print(values)
        print(field)
        return v


print(Bar())
print(Baz())
Run Code Online (Sandbox Code Playgroud)

输出:

WITHOUT NONE
{}
name='a' type=Optional[int] required=False default=None
a=None
WITH NONE
{}
name='a' type=Optional[int] required=False default=None
a=None
Run Code Online (Sandbox Code Playgroud)

python annotations python-typing pydantic

10
推荐指数
2
解决办法
9188
查看次数

zsh:未找到匹配项 - 尝试安装 pydantic[电子邮件]

激活我的 venv 并通过安装 Pydantic 后

pip install pydantic
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个新文件,如下所示:

from pydantic import Basemodel, EmailStr

class Person(BaseModel):
      id: int
      name: str
      email: EmailStr
Run Code Online (Sandbox Code Playgroud)

并且只是使用未使用的类运行该文件。但它返回了以下错误:

ModuleNotFoundError: No module named 'email_validator'
.
.
.
ImportError: email-validator is not installed, run `pip install pydantic[email]`
Run Code Online (Sandbox Code Playgroud)

运行时提示

ModuleNotFoundError: No module named 'email_validator'
.
.
.
ImportError: email-validator is not installed, run `pip install pydantic[email]`
Run Code Online (Sandbox Code Playgroud)

它告诉我:

zsh: no matches found: pydantic[email]
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个愚蠢的初学者错误吗?谢谢!

我重新安装了 Pydantic,重新创建了 venv,重新激活了 venv。

python zsh python-venv pydantic

9
推荐指数
1
解决办法
5072
查看次数

Pydantic V2 - @field_validator `values` 参数等效

我正在从 Pydantic v1 迁移到 v2,并尝试用 @field_validator 替换已弃用的 @validator 的所有使用。

以前,我使用values验证器函数的参数来引用其他先前验证的字段的值。正如v1 文档所说

您还可以将以下参数的任意子集添加到签名中(名称必须匹配):

  • 值:包含任何先前验证的字段的名称到值映射的字典

由于签名已更改,此参数似乎values不再被传递。但是,迁移文档没有提及v2 中的等效项,并且 v2 验证器文档页面尚未针对 v2.0 进行更新。@field_validatorvalues

有谁知道 v2 的首选方法?

V1验证器:

@validator('password2')
def passwords_match(cls, v, values, **kwargs):
    if 'password1' in values and v != values['password1']:
        raise ValueError('passwords do not match')
    return v
Run Code Online (Sandbox Code Playgroud)

python pydantic

9
推荐指数
1
解决办法
1万
查看次数

FastAPI 教程中 Pydantic 模型/模式之间的交互

我遵循FastAPI 教程,但不太确定建议的数据对象之间的确切关系是什么。

我们有models.py文件:

from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship

from .database import Base


class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    email = Column(String, unique=True, index=True)
    hashed_password = Column(String)
    is_active = Column(Boolean, default=True)

    items = relationship("Item", back_populates="owner")


class Item(Base):
    __tablename__ = "items"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    description = Column(String, index=True)
    owner_id = Column(Integer, ForeignKey("users.id"))

    owner = relationship("User", back_populates="items")
Run Code Online (Sandbox Code Playgroud)

schemas.py文件:

from typing …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy pydantic fastapi

8
推荐指数
1
解决办法
7093
查看次数

如何根据其他字段设置 Pydantic 字段值

from pydantic import BaseModel


class Grafana(BaseModel):
    user: str
    password: str
    host: str
    port: str
    api_key: str | None = None
    GRAFANA_URL = f"http://{user}:{password}@{host}:{port}"
    API_DATASOURCES = "/api/datasources"
    API_KEYS = "/api/auth/keys"
Run Code Online (Sandbox Code Playgroud)

使用 Pydantic,我收到两个未绑定变量错误消息userpassword其中 、 等GRAFANA_URL

有办法解决这个问题吗?在常规课程中,我只会GRAFANA_URL__init__方法中创建。对于 Pydantic,我不知道如何继续。

python pydantic

8
推荐指数
1
解决办法
4017
查看次数

Python 中没有赋值的类型提示

我的印象是typingPython 中的模块主要是为了提高代码可读性和代码文档目的。

在玩过它并阅读了有关该模块的内容之后,我设法让自己对它感到困惑。

即使这两个变量未初始化(就像您通常初始化它们一样,例如a = "test"),下面的代码也可以工作。

我只在上面添加了类型提示,一切看起来都很好。也就是说,我没有得到 a ,就像我在代码中NameError得到的那样aNameError: name 'a' is not defined

以这种方式声明变量(带有类型提示)是一种好的做法吗?为什么这有效?

from typing import Any

test_var: int
a: Any

print('hi')
Run Code Online (Sandbox Code Playgroud)

我期望test_var: int返回一个错误,指出该错误test_var尚未启动,并且我必须执行类似的操作test_var: int = 0(或任何值)。是否因为我向其中添加了类型提示而将其设置为默认值?

python annotations type-hinting python-typing

7
推荐指数
1
解决办法
2622
查看次数

嵌套协议的使用(协议的成员也是协议)

考虑一个也用协议注释的 Python 协议属性。我发现在这种情况下,即使我的自定义数据类型遵循嵌套协议,mypy 和 Pyright 都会报告错误。例如,下面的代码Outer遵循协议,因为HasHasA它遵循协议。hasa: HasAInnerHasA

from dataclasses import dataclass
from typing import Protocol

class HasA(Protocol):
    a: int

class HasHasA(Protocol):
    hasa: HasA

@dataclass
class Inner:
    a: int

@dataclass
class Outer:
    hasa: Inner

def func(b: HasHasA): ...

o = Outer(Inner(0))
func(o)
Run Code Online (Sandbox Code Playgroud)

但是,mypy 显示以下错误。

nested_protocol.py:22: error: Argument 1 to "func" has incompatible type "Outer"; expected "HasHasA"  [arg-type]
nested_protocol.py:22: note: Following member(s) of "Outer" have conflicts:
nested_protocol.py:22: note:     hasa: expected "HasA", got "Inner"
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题吗?

python-3.x mypy python-typing pyright

7
推荐指数
1
解决办法
453
查看次数

我什么时候应该使用 asyncio.create_task?

我正在使用 Python 3.10,我对asyncio.create_task.

在下面的示例代码中,无论我是否使用asyncio.create_task. 似乎没有什么区别。

如何确定何时使用以及使用与不使用相比asyncio.create_task有何优势?asyncio.create_task

import asyncio
from asyncio import sleep

async def process(index: int):
    await sleep(1)
    print('ok:', index)

async def main1():
    tasks = []
    for item in range(10):
        tasks.append(asyncio.create_task(process(item)))
    await asyncio.gather(*tasks)

async def main2():
    tasks = []
    for item in range(10):
        tasks.append(process(item)) # Without asyncio.create_task
    await asyncio.gather(*tasks)

asyncio.run(main1())
asyncio.run(main2())
Run Code Online (Sandbox Code Playgroud)

python task coroutine python-3.x python-asyncio

7
推荐指数
1
解决办法
2014
查看次数

展平嵌套 Pydantic 模型

from typing import Union
from pydantic import BaseModel, Field


class Category(BaseModel):
    name: str = Field(alias="name")


class OrderItems(BaseModel):
    name: str = Field(alias="name")
    category: Category = Field(alias="category")
    unit: Union[str, None] = Field(alias="unit")
    quantity: int = Field(alias="quantity")
Run Code Online (Sandbox Code Playgroud)

当像这样实例化时:

OrderItems(**{'name': 'Test','category':{'name': 'Test Cat'}, 'unit': 'kg', 'quantity': 10})
Run Code Online (Sandbox Code Playgroud)

它返回这样的数据:

OrderItems(name='Test', category=Category(name='Test Cat'), unit='kg', quantity=10)
Run Code Online (Sandbox Code Playgroud)

但我想要这样的输出:

OrderItems(name='Test', category='Test Cat', unit='kg', quantity=10)
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个目标?

python pydantic fastapi

6
推荐指数
1
解决办法
4018
查看次数