В PyCharm подсказка типа может правильно поддерживать стандартную библиотеку dataclass
.Однако, когда я использую тот же агрегат с mydataclass, PyCharm не может это поддерживать:
from dataclasses import dataclass
from typing import Tuple, Dict, TypeVar
_C = TypeVar('_C', bound=type)
class TestORM(type):
def __new__(cls, clsname: str, bases: Tuple, clsdict: Dict):
param = ""
for key, key_type in clsdict.get('__annotations__', {}).items():
param += f", {key}: {key_type.__name__} = {clsdict.get(key)}"
clsdict['__init__'] = make_init(param)
return super().__new__(cls, clsname, bases, clsdict)
@dataclass
class Test:
a: int = 0
def mydataclass(cls: _C) -> _C:
param = ""
for key, key_type in cls.__annotations__.items():
param += f", {key}: {key_type.__name__} = {getattr(cls, key)}"
setattr(cls, "__init__", make_init(param))
return cls
def make_init(param:str):
locals = {}
txt = f'def __init__(self{param}):\n pass'
exec(txt, None, locals)
return locals['__init__']
@mydataclass
class MyTest:
a: int = 0
class MyORMTest(metaclass=TestORM):
a: int = 0
if __name__ == '__main__':
Test(a='a')
MyTest(a='a')
MyORMTest(a='a')
Как мне сделать так, чтобы хинтинг типа PyCharm работал?
Подводя итог, я просто хочу знать, как PyCharm работает с пользовательским классом с dataclass
без каких-либо заглушек, относящихся к пользовательскому классу.И когда я использую тот же агрегат, что и dataclass
с exec
, чтобы сделать мою __init__
функцию динамической, я все равно не могу получить подсказку правильного типа.
PyCharm выполняет какой-то конкретный анализ или проверяет наличиеконкретная библиотека?