我想撰寫具有詳細型別的函式,以便在使用任何型別檢查器(例如 VScode 中的 Pylance)期間,您可以清楚地看到輸入型別。我設法使用默認輸入型別(例如int,然后將其擴展為numpy.ndarray. 但這是我遇到問題的地方。示例函式的代碼如下:
import numpy as np
def get_distance(arr1: np.ndarray, arr2: np.ndarray) -> int:
"""Returns Euclidian distance between 2 points in 3D space
Args:
arr1 (np.ndarray[float]): array 1 format [[x,y,z],...]
arr2 (np.ndarray[float]): array 2 format [[x,y,z],...]
Returns:
[int]: Distance between 2 points
"""
...
return some_distance
當我定義它然后在 Pylance 下尋找定義時,我設法得到 np.ndarray[Unknown, Unknown]:
(function) get_distance: (arr1: ndarray[Unknown, Unknown], arr2: ndarray[Unknown, Unknown]) -> int
Returns Euclidian distance between 2 points in 3D space
Args:
arr1 (np.ndarray[float]): point array 1
arr2 (np.ndarray[float]): point array 2
Returns:
[int]: Distance between 2 points
我的問題是:有沒有辦法定義輸入型別,即使使用 numpy 或任何其他外部庫,也會顯示正確的輸入型別?例如np.ndarray[float]或類似的東西。
uj5u.com熱心網友回復:
這是你想要的嗎?
from numpy.typing import NDArray
import numpy as np
def get_distance(
arr1: NDArray[np.float64],
arr2: NDArray[np.float64]
) -> int:
# ...
return some_distance
請注意,您需要使用typingnumpy 中的子模塊。
對我來說,這種方法是有效的。
但請再次注意,此方法不起作用: arr: np.ndarray[float]
正如你在我的編輯器中看到的 LSP-pyright

這帶有下劃線 red (error)
但這種方法非常好:

再次注意:你可以使用任何你喜歡的浮動
def get_distance(arr1: NDArray[np.float32] ...
def get_distance(arr1: NDArray[np.float64] ...
def get_distance(arr1: NDArray[np.float128] ...
# also integer
def get_distance(arr1: NDArray[np.int32],
但是,最重要的是,您使用的資料型別應該在numpy模塊中定義,并且您必須typing從 numpy 中使用,而不是從標準 python 中使用。為什么?因為 numpy 有自己的類似于 C 的資料型別,因為 numpy 是用 C 撰寫的,用 python 編譯和匯入。
uj5u.com熱心網友回復:
您的問題特定于 ndarray -> 它的型別有 2 個引數 - 形狀和資料型別。
TypeError: 'type' object is not subscriptable是因為您將浮點數作為形狀引數傳遞,它應該是類似串列的。(雖然我個人在 Python 3.10 上得到了更明確的錯誤 -TypeError: Too few arguments for numpy.ndarray
這將起作用:
from typing import Any
def get_distance(arr1: np.ndarray[Any, float], arr2: np.ndarray[Any, float]) -> int:
uj5u.com熱心網友回復:
我不確定我是否理解你的問題,但如果你想np.ndarray[float]被展示,這正是你需要傳遞的,而不是僅僅np.ndarray,像這樣:
def get_distance(arr1: np.ndarray[float], arr2: np.ndarray[float]) -> int:
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/418853.html
標籤:
上一篇:為什么在我的串列中添加專案時,在一個函式中,我需要將我添加的元素放在括號中?
下一篇:將活動類添加到導航欄
