我正在使用 Pydantic 進行設定管理,現在我遇到了一個問題。
假設我有多個環境的不同設定類。現在我想將類用作不同設定環境的欄位屬性,并在測驗期間更改它們。問題是我能夠獲取類,但在執行期間沒有明確設定它。這是一個簡短的例子:
In [96]: from typing import TypeVar
In [97]: UserSchemaType = TypeVar("UserSchemaType", bound=BaseModel)
In [98]: from pydantic import BaseModel
In [99]: class User(BaseModel):
...: id: str
...:
In [100]: class CustomUser(BaseModel):
...: id: str
...: first_name: str
...: last_name: str
...:
In [101]: class AppSettings(BaseSettings):
...: # some settings
...: foo: str = 'foo'
...:
...: user_class: UserSchemaType = User
...:
In [102]: class TestAppSettings(AppSettings):
...: # some settings
...: pass
...:
In [103]: test_app_settings = TestAppSettings()
In [104]: test_app_settings.dict()
Out[104]: {'foo': 'foo'}
In [105]: test_app_settings.user_class
Out[105]: __main__.User
In [106]: test_app_settings.user_class = CustomUser
ValueError: "TestAppSettings" object has no field "user_class"
uj5u.com熱心網友回復:
AppSettings.user_class 沒有正確輸入。
注釋user_class: UserSchemaType宣告 thatuser_class應該是 a 的實體BaseModel,例如user_class: UserSchemaType = User(...).
但是,您正在分配一個型別,而不是一個實體:user_class: UserSchemaType = User。
正確的注釋是user_class: type[UserSchemaType]or,取決于您需要使用的 python 版本from typing import Type,然后user_class: Type[UserSchemaType] = User.
如果您test_app_settings.__fields__在使用不正確的型別注釋時進行檢查,您會發現它user_class不存在。Pydantic 覆寫__setattr__,默認情況下它會檢查屬性名稱是否在 中__fields__,如果沒有找到它會拋出您遇到的錯誤。
我很快就找到了一個實作,__getattr__似乎 pydantic 沒有重新實作它,所以你的屬性訪問檢查(test_app_settings.user_class在你的例子中的輸入 105 上)受正常的 python MRO 屬性查找的影響,這就是它在那里找到它的原因.
順便說一句TypeVar,在您的示例中使用 a 并沒有真正得到任何東西,因為該類不是通用的。您可以輕松地使用user_class: BaseModel = User.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/415638.html
標籤:
