Я пытаюсь добавить подсказки типов в пакет, который поддерживаю, для более эффективных проверок. Однако мы используем некоторые внешние пакеты, такие как numpy, scipy и т. д., которые не везде имеют подсказки типов. Таким образом, довольно часто случается, что проверяющие типы не знают, какого типа переменная, сгенерированная этими другими пакетами, но я знаю. Есть ли способ сообщить средствам проверки типов, не меняя внешние пакеты.
Я пытаюсь ввести проверочный код следующим образом:
import numpy as np
from scipy.sparse import csr_matrix, spmatrix
def run() -> spmatrix:
a = csr_matrix(np.eye(3))
b = csr_matrix(np.eye(3))
c = a @ b
c = c.multiply(3.0)
return c
В этом коде средства проверки Pyright и аналогичных типов жалуются на строку c.multiply, а иногда и на возврат, потому что они не понимают, что c по-прежнему будет разреженной матрицей, и поэтому полагают, что она может не иметь функции .multiply или несоответствия. тип возвращаемого значения.
Я ищу какой-нибудь волшебный комментарий, который я мог бы добавить, чтобы сообщить этим проверяющим, что c будет разреженной матрицей. Типа c:spmatrix=a@b или c=a@b#pyright c:spmatrix или что бы это ни было.






Правильный способ сделать это — использовать файлы-заглушки, pyright информирующие о типах объектов в библиотеках. Эти существуют для pandas и numpy. Однако мне ничего не известно о scipy. Одна вещь, которую вы часто можете сделать (которая, кажется, работает в данном случае), — это использовать операторы assert(), чтобы помочь проверке статического типа:
def run() -> spmatrix:
a = csr_matrix(np.eye(3))
b = csr_matrix(np.eye(3))
c = a @ b
assert isinstance(c, csr_matrix) # this is new
c = c.multiply(3.0)
return c
Без этой строки это мой вывод pyright:
$ pyright test.py
~/test.py
~/test.py:9:11 - error: Cannot access attribute "multiply" for class "ndarray[Any, dtype[Unknown]]"
Attribute "multiply" is unknown (reportAttributeAccessIssue)
~/test.py:9:11 - error: Cannot access attribute "multiply" for class "ndarray[Any, Unknown]"
Attribute "multiply" is unknown (reportAttributeAccessIssue)
~/test.py:9:11 - error: Cannot access attribute "multiply" for class "matrix[Unknown, Unknown]"
Attribute "multiply" is unknown (reportAttributeAccessIssue)
3 errors, 0 warnings, 0 informations
Однако в заявлении assert() говорится:
$ pyright test.py
0 errors, 0 warnings, 0 informations
@Xenon согласился, что лучше не выполнять какой-либо дополнительный код. Я пытался создать заглушку, но не смог заставить ее работать. Единственным другим способом устранить предупреждение было c = typing.cast(csr_matrix, a @ b), что, на мой взгляд, было еще хуже.
Спасибо! это, безусловно, полезный и действенный способ сделать это. Если бы существовал способ, который наверняка ничего не запускает, я бы предпочел это. Поэтому я оставлю это открытым на мгновение, на случай, если кто-нибудь знает, как это сделать.