PyCharm и предупреждение о типе хинтинга - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть следующее property, определенное для class:

import numpy as np
import typing as tp

@property
def my_property(self) -> tp.List[tp.List[int]]:

    if not self.can_implement_my_property:
        return list()

    # calculations to produce the vector v...

    indices = list()

    for u in np.unique(v):
        indices.append(np.ravel(np.argwhere(v == u)).tolist())

    return sorted(indices, key=lambda x: (-len(x), x[0]))

PyCharm жалуется на последнюю строку фрагмента выше, сигнально:

Ожидаемый тип 'List [List [int]], вместо него есть List [Iterable]' ...

Это довольно удивительно, поскольку:

  • indicesобъявляется как list
  • ravel гарантирует, что совпадающие значения argwhere преобразуются в одномерный Numpy вектор
  • tolist преобразует одномерный Numpy вектор в список
  • полученный список добавляется в список indices

Это может быть ложным положительным результатом из-за неправильной обработки подсказок типа на стороне IDE,потому что List[int] на самом деле Iterable ... и, следовательно, List[List[int]] = List[Iterable].Но я не могу быть на 100% уверен в этом.

Есть какие-нибудь подсказки по этому вопросу?Как я могу обеспечить возвращаемое значение к ожидаемому типу?

1 Ответ

0 голосов
/ 01 января 2019

Благодаря комментарию @mgilson, вот решение, которое я реализовал для решения проблемы:

indices = list()

for u in np.unique(v):
    indices.append(list(it.chain.from_iterable(np.argwhere(v == u))))

return sorted(indices, key=lambda x: (-len(x), x[0]))
...