如何动态定义 pylance 等的函数签名?

问题描述 投票:0回答:1

我正在创建一个基于

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):

python python-typing pyright
1个回答
0
投票

不幸的是,没有。无法基于动态字符串(或

Literal['foo']
/
LiteralString
)定义参数。

您能做的最好的事情就是复制生成的

__init__
的签名,但您无法更改其要求。

第二个最佳解决方案是编写一个 Mypy 插件。当然,这不适用于任何其他类型检查器,包括 Pyright/Pylance。

© www.soinside.com 2019 - 2024. All rights reserved.