gpt4 book ai didi

python - 使用抽象方法进行 Pycharm 类型提示

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:49 30 4
gpt4 key购买 nike

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)

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

我想知道 Pycharm 是否有错,或者我有错,这不是实现这个抽象类的方法,我应该尝试不同的方法?

这是一个最小的例子。我正在处理的代码在抽象类中有一个主(非抽象)方法,它调用许多抽象方法。 main 函数在所有子类中通用,但需要重写抽象方法以实现子类的特定目的。结果我到处都是类型提示错误。

最佳答案

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

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)

但是,添加字符串并不被认为是好的风格。因此,如果您使用 format ,问题一开始就不会存在,因为 format 可以处理任何具有 __repr__ 的对象>__str__ 方法(几乎任何对象)。因此,即使 calculate_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. """
pass

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

关于python - 使用抽象方法进行 Pycharm 类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46115183/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com