打字:如何将类作为参数传递?

时间:2021-02-28 11:30:43

标签: python python-3.x python-typing

我试图在 Python 中将一个类传递给一个函数,然后在函数中实例化它并返回它。 到目前为止,这有效,但是一旦我尝试添加 Python 类型,我就会收到以下错误:

Expected no arguments to "object" constructor Pylance (reportGeneralTypeIssues)

这是发生错误的最小示例。

from dataclasses import dataclass
from typing import Dict, Type, TypeVar

@dataclass
class Bar:
    x: int

T = TypeVar('T')

def Foo(clazz: Type[T], kwargs: Dict[str, int]) -> T:
    return clazz(**kwargs)  # --> Expected no arguments to "object" constructor

bar = Foo(Bar, {'x': 1})
print(type(bar))  # --> <class '__main__.Bar'>

有人可以向我解释我在这里做错了什么吗?

1 个答案:

答案 0 :(得分:0)

它可以与 cast 一起工作,明确地告诉 类型检查器 clazz 是对象的子类型 可以接受命名参数。 (可能有 一个比 Any 更好的投射目标, 但这有效)


from dataclasses import dataclass
from typing import Dict, Type, TypeVar, Any, cast

@dataclass
class Bar:
    x: int

T = TypeVar('T')


def Foo(clazz: Type[T], kwargs: Dict[str, int]) -> T:
    clazz = cast(Type[Any], clazz)
    return clazz(**kwargs)  # --> Expected no arguments to "object" constructor

bar = Foo(Bar, {'x': 1})
print(type(bar))