我有一个类装饰器,它向装饰类添加了一些函数和字段。
@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
创建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) 激活我的 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。
我正在从 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) 我遵循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) 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,我收到两个未绑定变量错误消息user,password其中 、 等GRAFANA_URL。
有办法解决这个问题吗?在常规课程中,我只会GRAFANA_URL在__init__方法中创建。对于 Pydantic,我不知道如何继续。
我的印象是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 协议属性。我发现在这种情况下,即使我的自定义数据类型遵循嵌套协议,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.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) 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 ×8
pydantic ×6
python-3.x ×3
annotations ×2
fastapi ×2
type-hinting ×2
coroutine ×1
dynamic ×1
mypy ×1
pyright ×1
python-venv ×1
sqlalchemy ×1
task ×1
zsh ×1