Есть ли способ обойти правило проверки типов при использовании определенного класса? [закрыто]Python

Программы на Python
Anonymous
Есть ли способ обойти правило проверки типов при использовании определенного класса? [закрыто]

Сообщение Anonymous »

Я пытаюсь автоматически реализовать унаследованные абстрактные методы, используя метакласс в Python. Мне это удалось, и он работает правильно.
Однако VSCode отображает ошибку reportAbstractUsage в момент создания экземпляра класса.
ниже приведен код, поднимающий проблему

Код: Выделить всё

from abc import ABC, ABCMeta, abstractmethod

class MyBaseClass(ABC):
@abstractmethod
def base_foo(self):
pass

class Meta(ABCMeta):
def __new__(cls, name, bases, attrs):
for base in bases:
if issubclass(base, ABC):
for attr_name, attr_value in base.__dict__.items():
if attr_name in attrs:
attrs[attr_name] = cls.deco(attrs[attr_name])
elif getattr(attr_value, "__isabstractmethod__", False):
attrs[attr_name] = cls.deco(cls.default_method(attr_name))
return super().__new__(cls, name, bases, attrs)

@classmethod
def deco(cls, func):
def wrapper(*args, **kwargs):
print(f"Before calling {func.__name__}")
result = func(*args, **kwargs)
print(f"After calling {func.__name__}")
return result
return wrapper

@classmethod
def default_method(cls, method_name):
def default(*args, **kwargs):
print(args)
print(kwargs)
print(f"{method_name} is not implemented.")
return default

class MyDerivedClass(MyBaseClass, metaclass=Meta):
pass

a = MyDerivedClass()
a.base_foo()
Несмотря на то, что эта проблема не влияет на среду выполнения, я хотел бы устранить эту ошибку, как показано ниже (просто добавив комментарий «type: ignore [reportAbstractUsage]»)

Код: Выделить всё

from abc import ABC, ABCMeta, abstractmethod

class MyBaseClass(ABC):
@abstractmethod
def base_foo(self):
pass

# type: ignore [reportAbstractUsage]
class Meta(ABCMeta):
def __new__(cls, name, bases, attrs):
for base in bases:
if issubclass(base, ABC):
for attr_name, attr_value in base.__dict__.items():
if attr_name in attrs:
attrs[attr_name] = cls.deco(attrs[attr_name])
elif getattr(attr_value, "__isabstractmethod__", False):
attrs[attr_name] = cls.deco(cls.default_method(attr_name))
return super().__new__(cls, name, bases, attrs)

@classmethod
def deco(cls, func):
def wrapper(*args, **kwargs):
print(f"Before calling {func.__name__}")
result = func(*args, **kwargs)
print(f"After calling {func.__name__}")
return result
return wrapper

@classmethod
def default_method(cls, method_name):
def default(*args, **kwargs):
print(args)
print(kwargs)
print(f"{method_name} is not implemented.")
return default

class MyDerivedClass(MyBaseClass, metaclass=Meta):
pass

a = MyDerivedClass()  # no reportAbstractUsage error
a.base_foo()
Я понимаю, что отключение его построчно везде, где создается экземпляр класса, — это один из способов справиться с этим. Однако я бы предпочел более автоматическое решение, которое не требует добавления комментария каждый раз, когда я использую класс.
Поэтому я ищу способ игнорировать 'reportAbstractUsage ' ошибка везде, где создается экземпляр класса.
Я просмотрел документацию Pyright и проконсультировался с ChatGPT, но пока не нашел решения. Любая помощь будет оценена по достоинству.

Подробнее здесь: https://stackoverflow.com/questions/787 ... lass-is-ut

Вернуться в «Python»