包含ABCMeta实例的列表的函数注释

时间:2017-08-25 14:42:28

标签: python annotations abstract-class

我试图使用Python函数注释(PEP 3107)作为PyCharm的类型提示,但未能这样做。问题可能与我使用ABCMeta

有关
import abc

class base(object, metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def test(self):
        pass

class deriv1(base):
    def test(self):
        return "deriv1"

class deriv2(base):
    def test(self):
        return "deriv2"

my_list = []
def append_to_list(el: base) -> list(base):
# def append_to_list(el):
#     """
#     :param el: item to add
#     :type: base
#     :return: items so far
#     :rtype: list[base]
#     """
   my_list.append(el)
   return my_list

append_to_list(deriv1())
a = append_to_list(deriv2())
for o in a:
    print(o.test())

此代码无法运行。相反,我在TypeError: 'ABCMeta' object is not iterable行上获得def append_to_list

当我使用带有docstring类型提示的替代函数(上面代码中的注释行)时,一切都很有效。

是否可以对这种类型的提示使用注释?

1 个答案:

答案 0 :(得分:1)

它与abc无关,但是因为你告诉Python要进行字面评估

list(base)

这是不可能的,因为base不可迭代。这就是错误消息告诉你的。

您需要将其更改为方括号并将其包装在引号中(因为list类型不可订阅):

def append_to_list(el: base) -> 'list[base]':

或使用可订阅的typing.List

from typing import List

def append_to_list(el: base) -> List[base]:

表示它是包含base个对象的列表。