在我当前的项目中,我们使用 OpenAPI-to-TypeScript-API 生成器,它生成自动类型化函数,用于通过 Axios 调用 API 端点。在 Python 中,我们使用
snake_case
作为类属性,而在 TypeScript 中,我们使用
camelCase
使用此设置,我们发现别名属性 (
Field(..., alias="***")
) 与 || 相结合非常有用。 |property.
allow_population_by_field_name = True
简单模型类示例:
问题是:为什么 Pylance 不明白我希望能够编写
from pydantic import BaseModel, Field
class MyClass(BaseModel):
my_property: str = Field(..., alias="myProperty")
class Config:
allow_population_by_field_name = True
if __name__ == "__main__":
my_object = MyClass(my_property="banana")
?请参阅下面的 vscode 截图:
MyClass(my_property="banana")
是否有任何方法可以配置 Pylance/Pydantic/vscode 来更好地理解这一点?
“只是生活”这是有问题的,因为在我们的代码中出现这样的红线会促进一种“心态”红色可能没问题”,所以他们失去了权力。
2023 年 5 月 8 日编辑:
我们找到了一种“规避”这个问题的方法,通过创建一个包含
的包装类。 pylance 似乎并没有注意到这一点,因此它的表现就好像它不存在一样。
alias_generator
我确信人们不会经常使用这样的系统,但这对我们的团队有帮助。它还允许我们不必到处写
= Field(..., alias="camelCase")
everywhere.
你遇到的问题是Pylance的类型提示系统无法完全理解Pydantic的
allow_population_by_field_name
配置选项。
虽然Pylance已经很擅长理解Pydantic模型,但它仍然依赖于Python的类型提示系统,而这个系统本身并不知道Pydantic的这个特定行为。 当你设置了
allow_population_by_field_name = True
后,Pydantic实际上改变了它的初始化行为,允许使用别名来创建模型实例。 但是,Pylance 仍然认为你只能使用模型定义中的字段名,所以它会报错。
目前,没有直接的方法能让Pylance完全理解
allow_population_by_field_name
的行为。
不过,你可以尝试以下几种方法来解决这个问题,或者至少改善代码提示体验:
1. 使用
typing.cast
: 你可以使用
typing.cast
来告诉 Pylance 你知道自己在做什么,它不应该报错。例如:
from typing import cast
from pydantic import BaseModel, Field
class MyClass(BaseModel):
my_property: str = Field(..., alias="myProperty")
class Config:
allow_population_by_field_name = True
if __name__ == "__main__":
my_object = cast(MyClass, MyClass(my_property="banana"))
这样Pylance就不会再报错了,因为它会认为
my_object
的类型是
MyClass
。
2. 使用工厂函数 : 你可以创建一个工厂函数,该函数接受驼峰式命名法的参数并返回一个模型实例。
from pydantic import BaseModel, Field
class MyClass(BaseModel):
my_property: str = Field(..., alias="myProperty")
class Config:
allow_population_by_field_name = True
def create_my_class(my_property: str) -> MyClass:
return MyClass(my_property=my_property)
if __name__ == "__main__":
my_object = create_my_class(my_property="banana")
3. 忽略错误
: 如果你确定你的代码是正确的,而且你不想使用上面的方法,你可以简单地忽略Pylance的错误提示。 你可以在VS Code的设置中禁用Pylance的错误提示,或者在代码中使用
# type: ignore
来忽略特定的错误提示。
4. 使用你提到的包装类 : 你找到的包装类方法确实是一种有效的规避方法。 虽然它可能不是最优雅的解决方案,但如果它对你的团队有效,那么继续使用它也 perfectly acceptable.
总结 :
-
Pylance 目前无法完全理解 Pydantic 的
allow_population_by_field_name
行为。 -
你可以使用
typing.cast
,工厂函数或忽略错误来解决这个问题。 - 你也可以继续使用你找到的包装类方法。
希望这些信息能帮到你!
标签:python,python-typing,pydantic,pyright From: 75756665