如何为继承类的构造函数动态设置类型提示?

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

使用以下代码:

import dataclasses
@dataclasses.dataclass
class A:
    a: int
    b: float
A(<cursor location>

如果我现在让我的 LSP Pyright 驱动程序在光标位置给我建议,它会找到“a”和“b”参数。

我如何在我自己的班级中做到这一点?考虑以下几点:

class Parent:
    def __init__(self, **kvargs):
       # This is done.
       for k, v in kvargs.items():
            setattr(self, k, v)

    def __init_subclass(cls) -> None:
       # How to add a and b typing information to A.__init__ ?
       print(get_type_hints(cls))
       setattr(cls, "__init__", 
            # magic? how to do this:
            def __init__(a: int, b: int): # how to generate function signature from get_type_hints ?
                super().__init__(a=a, b=b)
       )

class A(Parent):
    a: int
    b: float

A(<cursor location

我不是在问如何动态地从类中获取输入信息。假设我想将

a: int, b: float
函数精确添加为
A.__init__
,但类型是动态的。我问如何从从另一种类型提取的
get_type_hints
动态设置构造函数的类型提示。

这个问题是关于更好的自动完成还是如何动态生成方法?

关于自动完成和输入信息。我编写了自己的

__init__
函数,它接受
*args, **kvargs
参数并手动检查它们。现在我想要自动完成并向其中添加
__annotations__
信息。我尝试浏览
dataclass
源代码,但是这是我无法理解的魔法 https://github.com/python/cpython/blob/main/Lib/dataclasses.py#L471 .

python type-hinting typing
1个回答
0
投票

typing
对此有原生支持:
dataclass_transform
。使用它非常简单:

from typing import dataclass_transform

@dataclass_transform()  # This must be called.
class Parent:
    ...

就是这样!根据父类的行为方式,您可以提供相应的关键字参数,但上面的代码本身就可以正常工作:

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