我正在编写一个类似于
pydantic
叫
ImportString
的
ImportPlugin
类型,它导入并可选择调用对象并返回调用结果。例如:
from typing import Annotated, TypeVar
from pydantic import BaseModel, BeforeValidator
class MyModel(BaseModel):
length: ImportPlugin[int]
MyModule(length={"obj": "builtins.len", "args": ([1,2,3],)}).length # 3
My
ImportPlugin
type 的定义如下:
T = TypeVar('T')
def generate_plugin(plugin_dict: Dict[str, Any]):
return _Plugin.model_validate(plugin_dict).generate()
ImportPlugin = Annotated[T, BeforeValidator(generate_plugin)]
其中
_Plugin
类是一个泛型
BaseModel
,用于处理导入和调用对象。
这工作正常,但 Pylance 绘制了一个字典输入
MyClass
下的红色波浪线,将其标记为
reportArgumentType
有办法解决这个问题吗? Pylance 应该明白输入类型应该是
BeforeValidator
所期望的,而不是
T
遇到的
reportArgumentType
错误是因为 Pylance 无法完全理解
Annotated
类型提示的含义。虽然
Annotated
类型提示能被 Python 解释器正确处理,但类型检查器(如 Pylance)在理解其复杂用法时仍有困难。
以下是一些解决方法:
1. 使用
typing_extensions.Annotated
:
-
尝试使用
typing_extensions
库中的Annotated
类型提示。typing_extensions
库提供了对新类型提示功能的回溯兼容支持,这可能有助于 Pylance 更准确地理解的代码。```python from typing_extensions import Annotated from typing import TypeVar from pydantic import BaseModel, BeforeValidator
T = TypeVar('T')
# ...
ImportPlugin = Annotated[T, BeforeValidator(generate_plugin)] ```
2. 使用类型别名:
-
创建一个类型别名,明确表示
ImportPlugin
的预期类型。这可以帮助 Pylance 更好地理解的意图。```python from typing import TypeVar, Dict, Any from pydantic import BaseModel, BeforeValidator
T = TypeVar('T')
class _Plugin(BaseModel): # ...
def generate_plugin(plugin_dict: Dict[str, Any]): return _Plugin.model_validate(plugin_dict).generate()
PluginDict = Dict[str, Any] ImportPlugin = Annotated[T, BeforeValidator(generate_plugin)]
class MyModel(BaseModel): length: ImportPlugin[int]
MyModule(length={"obj": "builtins.len", "args": ([1, 2, 3], )}) ```
3. 忽略错误:
-
如果上述方法均无效,可以选择忽略 Pylance 报告的错误。可以使用
# type: ignore
注释来抑制特定代码行的类型检查。python MyModule(length={"obj": "builtins.len", "args": ([1, 2, 3], )}) # type: ignore
请注意,忽略错误应作为最后的手段,因为它可能会掩盖潜在的类型错误。
希望这些解决方案能帮助解决
reportArgumentType
错误。如果还有其他问题,请随时提出!