Python Pycharm类型暗示与抽象方法

Python Pycharm类型暗示与抽象方法,python,python-2.7,pycharm,abstract-class,Python,Python 2.7,Pycharm,Abstract Class,在本例中,所有形状的面积计算方式都不同,但所有子类都有一个打印当前面积的通用方法。Pycharm抱怨最后一行的区域,说它的类型是None,而不是TypeVar('AnyStr',str,unicode)。这是有意义的,因为calculate\u area不返回任何内容。另一方面,calculate\u area是一种抽象方法,因此它不会直接在Shape下调用,它将由不同的子类实现。显然,calculate\u area的返回类型不能在子类上强制执行,但是PyCharm不应该推迟告诉我类型是错误的

在本例中,所有形状的面积计算方式都不同,但所有子类都有一个打印当前面积的通用方法。Pycharm抱怨最后一行的
区域
,说它的类型是
None
,而不是
TypeVar('AnyStr',str,unicode)
。这是有意义的,因为
calculate\u area
不返回任何内容。另一方面,
calculate\u area
是一种抽象方法,因此它不会直接在
Shape
下调用,它将由不同的子类实现。显然,
calculate\u area
的返回类型不能在子类上强制执行,但是PyCharm不应该推迟告诉我类型是错误的,因为
calculate\u area
是抽象的吗

我想知道Pycharm是否有错,还是我有错,这不是实现这个抽象类的方法,我应该尝试另一种方法


这是一个最小的例子。我正在处理的代码在抽象类中有一个main(非抽象)方法,它调用许多抽象方法。main函数通常在所有子类中工作,但是为了子类的特定目的,需要重写抽象方法。因此,我到处都有类型暗示错误

问题在于示例中的
calculate\u area
隐式返回None。您可以通过返回一个空字符串来“修复它”。这将捕获子类仅返回其
calculate\u area
中的
super(subclass,self.calculate\u area()
)的情况:

from abc import ABCMeta, abstractmethod

class Shape(object):

    _metaclass_ = ABCMeta

    @abstractmethod
    def calculate_area(self):
        """ Returns the area of the shape
        :return str: A string of the area. """
        pass

    def print_area(self):
        area = self.calculate_area()
        print("Area is " + area)
但是,添加字符串被认为不是好的样式。因此,如果您使用
格式
,问题首先就不会存在,因为
格式
可以处理任何具有
\uuuu repr\uuuu
\uu str\uuuuu
方法的对象(实际上是任何对象)。因此,即使
calculate\u area
返回
None
或返回一个数字而不是字符串,它也可以工作:

class Shape(object):

    _metaclass_ = ABCMeta

    @abstractmethod
    def calculate_area(self):
        """ Returns the area of the shape
        :return str: A string of the area. """
        return ""

    def print_area(self):
        area = self.calculate_area()
        print("Area is " + area)
class Shape(object):

    _metaclass_ = ABCMeta

    @abstractmethod
    def calculate_area(self):
        """ Returns the area of the shape
        :return str: A string of the area. """
        pass

    def print_area(self):
        area = self.calculate_area()
        print("Area is {}".format(area))