小编rbh*_*lla的帖子

当 pydantic 模型是另一个模型的嵌套子模型时,排除该模型上的字段

我有一个 pydantic 模型,我想动态排除其中的字段。

我可以通过覆盖dict模型上的函数来做到这一点,以便它可以采用我的自定义标志,例如:

class MyModel(BaseModel):
  field: str

  def dict(self, **kwargs):
    if ('exclude_special_fields' in kwargs):
       super().dict(exclude={"field": True}, **kwargs)

    super().dict(**kwargs)
Run Code Online (Sandbox Code Playgroud)

.dict但是,如果我的模型是调用它的另一个模型的子模型,则这不起作用:

class AnotherModel(BaseModel):
  models: List[MyModel]

AnotherModel(models=[...]).dict(exclude_special_fields=True) # does not work
Run Code Online (Sandbox Code Playgroud)

这是因为当MyModel.dict()调用时,它不会使用与父级相同的参数来调用。

dict也可以在父模型上编写一个覆盖,以指定任何子组件的排除(例如exclude={"models": {"__all__": {"field": True}}}),但在我的现实世界示例中,我有许多使用这个子模型的父模型,并且我不想让为每一个写一个覆盖。

无论如何,我可以确保子模型知道何时排除字段吗?

额外的上下文

额外的上下文对于问题来说并不完全重要,但我想要这样做的原因是排除模型上的某些字段(如果它从 API 调用返回)。

python pydantic

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

使用 Docker 和诗歌时在 VS Code 中选择 Python 解释器

我在 VS Code 中打开一个 monorepo 文件夹,其中顶部文件夹是不同的服务。其中一项服务是使用诗歌来安装依赖项的 python 服务。

我正在使用诗歌的in-project=true virtualenv设置,以便所有依赖项实际上都存储在./python-service/.venv.

monorepo 可以使用 docker-compose 文件在本地运行。因此,任何依赖项安装都是在容器上完成的。

VS Code 不会自动检测这个虚拟环境,但是手动设置时,会立即出错:

Linter 'flake8' is not installed. Please install it or select another linter".
Error: spawn /Users/me/dev/project/python-service/.venv/bin/python EACCES
Run Code Online (Sandbox Code Playgroud)

如果我查看该./python-service/.venv/bin/python文件,我可以看到它实际上是一个符号链接,指向的符号链接/usr/local/bin/python在我的计算机上不存在,仅在容器上存在。

由于 VS Code 在我的计算机上运行,​​而不是在容器上运行,因此它无法遵循此符号链接是有道理的。

我考虑过两种选择:

  1. 使用诗歌的always-copy virtualenv选项。由于某种原因,这实际上并没有复制python二进制文件(由其他人复制)。所以这实际上并不能解决这个问题。
  2. VS Code 的开发容器插件。虽然这在理论上可行,但必须为每个 python 服务打开一个新窗口似乎很麻烦。理想情况下,VS Code 能够根据需要使用适当的 venv。

配置诗歌/vscode/docker 以确保可以在 VS Code 中设置解释器的正确方法是什么?

python docker visual-studio-code python-poetry

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

无法确定 Pydantic 模型中的字段类型是否为列表类型

我正在尝试自动将 Pydantic 模型转换为数据库模式。为此,我递归地循环遍历 Pydantic 模型的字段以确定字段的类型。

作为一个例子,我有这个简单的模型:

from typing import List
from pydantic import BaseModel

class TestModel(BaseModel):
    tags: List[str]
Run Code Online (Sandbox Code Playgroud)

__fields__我使用此处描述的属性递归模型: https ://docs.pydantic.dev/usage/models/#model-properties

如果我这样做,type(TestModel).__fields__['tags']我会看到:

ModelField(name='tags', type=List[str], required=True)
Run Code Online (Sandbox Code Playgroud)

我想以编程方式检查该ModelField类型是否有List起源。我尝试过以下方法,但没有一个有效:

  • type(TestModel).__fields__['tags'].type_ is List[str]
  • type(TestModel).__fields__['tags'].type_ == List[str]
  • typing.get_origin(type(TestModel).__fields__['tags'].type_) is List
  • typing.get_origin(type(TestModel).__fields__['tags'].type_) == List

令人沮丧的是,这确实返回True

  • type(TestModel).__fields__['tags'].type_ is str

我确认字段是List类型的正确方法是什么?

python python-typing pydantic

4
推荐指数
1
解决办法
2945
查看次数

仅当作为 FastAPI 调用的一部分返回时才排除 pydantic 模型字段

语境

我有一个非常复杂的 pydantic 模型,其中有很多嵌套的 pydantic 模型。我想确保某些字段永远不会作为 API 调用的一部分返回,但我希望这些字段用于内部逻辑。

我尝试过的

我首先尝试使用 pydantic 的Field函数来指定exclude我不想返回的字段上的标志。这有效,但是我的内部逻辑中的函数每当.dict()通过调用.dict(exclude=None).

相反,我return_in_api在 上指定了一个自定义标志Field,目标是仅在 FastAPI 调用时应用排除.dict()。我尝试编写一个中间件来根据包含的嵌套字段来调用.dict()和传递我自己的属性。然而,FastAPI 的中间件为我提供了一个响应流,我不想过早地解析它。excludereturn_in_api=False

相反,我编写了一个装饰器,它.dict()使用适当的值调用路由处理程序的返回值exclude

问题

一个挑战是,每当添加新端点时,添加它们的人都必须记住包含此装饰器,否则字段会泄漏。

理想情况下,我想将此装饰器应用于每个路由,但通过中间件执行此操作似乎会破坏响应流。

python starlette pydantic fastapi

4
推荐指数
1
解决办法
4727
查看次数

当它们通过剪辑路径时模糊 svg 形状

下面的例子:

例子

我想在中间保留一个固定区域,circle通过它来设置 svg的动画。

我见过的大多数示例都涉及某种合并,最终显示原始圆圈和模糊版本。让我做这样的事情:

<clipPath id="top-mask">
  <rect id="top-mask-rect" x="0" y="-100" width="100" height="100" />
</clipPath>

<filter id="top-blur" x="-200%" y="-200%" width="500%" height="500%">
  <feimage xlinkHref="url(#top-mask)" result="mask" />
  <feGaussianBlur stdDeviation="1.5" result="blur" />

  <feComposite in2="mask" in="blur" operator="in" result="comp" />

  <feMerge result="merge">
    <feMergeNode in="SourceGraphic" />
    <feMergeNode in="comp" />
  </feMerge>
</filter>
Run Code Online (Sandbox Code Playgroud)

这似乎将圆圈覆盖在略微模糊的版本之上。我的下一个天真的步骤是删除feComposite,而是应用于根本不起作用的clipPath两者feMergeNode

解决这个问题的正确方法是什么?

svg

3
推荐指数
1
解决办法
541
查看次数

Chrome在本地主机上加载缓存的文件

我现在在两台不同的机器上都遇到这个问题。

版本63.0.3239.84(官方内部版本)(64位)OSX 10.12.6

Chrome浏览器会持续在上加载旧的缓存文件http://localhost:3000。我可以阻止它的唯一方法是使用隐身模式。如果我使用cmd + shift + r它可以进行一次刷新,然后在重新加载时返回到旧文件。

我通常会把检查员调高,所以我尝试打勾disable cache,这没什么。我还尝试通过chrome的设置删除我的缓存文件,但此操作无济于事。

我在这里想念什么吗?

google-chrome

2
推荐指数
1
解决办法
2239
查看次数