我正在创建一个基于
pydantic.BaseModel
的框架,该框架将管理从 dynamodb 中放置和获取记录。
模型示例如下:
class User(DynamoDanticBaseModel):
user_id: str
first_name: str
@classmethod
def primary_key(cls) -> str:
return "USER#{user_id}"
@classmethod
def sort_key(cls) -> str:
return "USER"
使用
__init_subclass__
,我可以获取可格式化字符串并验证 PK/SK 的所需部分是否已在类中定义。
一般定义的是一个类方法
get
,它使用这些值调用下面的boto3并获取a记录,填充模型并返回新的模型实例。
user = User(user_id='example', first_name='Bacon')
user.put(dynamo_table_ref)
user = User.get(dynamo_table_ref, user_id='example')
user.first_name # => "Bacon"
这一切都有效。我的问题是获取方法接口是:
def get(cls, table, **kwargs):
。开发人员无法看到需要什么参数。
有没有一种方法来布局我的代码,或者我应该使用的模式,这意味着我可以让签名提示显示所需的参数?动态到主键和排序键方法中定义的所需参数?
例如
def get(cls, table, user_id: str):
不幸的是,没有。无法基于动态字符串(或
Literal['foo']
/LiteralString
)定义参数。
您能做的最好的事情就是复制生成的
__init__
的签名,但您无法更改其要求。
第二个最佳解决方案是编写一个 Mypy 插件。当然,这不适用于任何其他类型检查器,包括 Pyright/Pylance。