嵌套列表的函数返回值的静态类型化

时间:2018-07-11 08:31:48

标签: python python-3.x static-typing mypy

我有一个Python代码:

Select 
  * 
From
  TableB
LEFT JOIN
  TableB
  ON TableA.primary_key = TableB.foreign_key;

我想生成列表以返回一个列表,其中包括一个可能包含None或MyClass对象的列表。 简化的列表可能看起来像这样

from typing import List, Optional


class MyClass:
    pass


def generate_list() -> List[List[Optional[MyClass]]]:
    my_list = [[None for _ in range(10)] for _ in range(10)]
    # assignments might be extended in the future
    my_list[0][0] = MyClass()
    return my_list

现在mypy在网上引发错误

[[None, None, <my_class_object>], [<my_class_object>, None, <my_class_object>]]

有消息

my_list[0][0] = MyClass()

我想我缺少了一些东西,或者甚至可能无法完成我想要的事情。

1 个答案:

答案 0 :(得分:1)

在这种情况下,mypy的推断无法推断出您想要的内容。从文档中:

  

Mypy将初始分配视为变量的定义。如果您未明确指定变量的类型,则mypy将根据值表达式的静态类型来推断类型

https://mypy.readthedocs.io/en/latest/type_inference_and_annotations.html

my_list被推断为List[List[None]],因为这是表达式的类型。要解决此问题,必须将其注释为List[List[Optional[MyClass]]]