如何向工厂方法添加提示?

2024-09-28 05:35:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种方法来注释工厂函数的返回类型

它返回“AlgorithmBase”的随机子级

class AlgorithmFactory:
    _algorithm_types = AlgorithmBase.__subclasses__()

    def select_random_algorithm(self) -> AlgorithmBase:
        # Select random algorithm
        algorithm_class = self._random_generator.choice(AlgorithmFactory._algorithm_types)
        algorithm = algorithm_class()
        return algorithm

我从mypy获得错误信息:

我得到的错误是:

Cannot instantiate abstract class 'AlgorithmBase' with abstract attributes 'get_constraints' and 'satisfy_constraints'

在这段代码中无法实例化类'AlgorithmBase',如何让mypy理解它

我希望避免在返回类型中使用“Union”指定实际的子类。有什么建议吗


Tags: 方法函数selfabstract类型工厂randomalgorithm
2条回答

据我所知,这应该是可行的,但似乎有一个或多个AlgorithmBase子类没有实现这两个抽象方法

让MyPy为

import abc

class AlgorithmBase(abc.ABC):
    @abc.abstractmethod
    def get_constraints(self):
        raise NotImplementedError

    @abc.abstractmethod
    def satisfy_constraints(self):
        raise NotImplementedError


class SomeAlgorithm(AlgorithmBase):
    pass


class AlgorithmFactory:
    def get(self) -> AlgorithmBase:
        algorithm = SomeAlgorithm()
        return algorithm

产生与您得到的错误相同的错误,并且一旦实现了这些方法,它就会毫无错误地运行

import abc

class AlgorithmBase(abc.ABC):
    @abc.abstractmethod
    def get_constraints(self):
        raise NotImplementedError

    @abc.abstractmethod
    def satisfy_constraints(self):
        raise NotImplementedError


class SomeAlgorithm(AlgorithmBase):
    def get_constraints(self):
        pass

    def satisfy_constraints(self):
        pass


class AlgorithmFactory:
    def get(self) -> AlgorithmBase:
        algorithm = SomeAlgorithm()
        return algorithm

这里的问题不是返回类型,而是“\u算法\u类型”。mypy无法理解它是什么类型,所以它假设它类似于返回类型,并得到了错误

以下代码修复了该问题:

_algorithm_types: List[Type[AlgorithmBase]] = AlgorithmBase.__subclasses__()

相关问题 更多 >

    热门问题