排序列表的 Python 类型注释

问题描述 投票:0回答:1
def my_function(dist: list[int], clabels: list[int]):
    ...

暗示

dist
中的
my_function
参数必须是整数排序列表的正确方法是什么?

python python-typing
1个回答
0
投票

如果您的目标是影响其他开发人员传递排序列表,您有几种方法可以做到这一点。

  • 将变量命名为具有暗示性的名称,例如
    dist_asc
    dist_desc
  • 使用文档字符串描述您对变量的假设。
  • 使用
    typing.Annotated
    将任意字符串添加到类型注释中。
  • 您可以使用
    typing.NewType
    来要求您的输入来自已知函数或由某人使用您的
    NewType
    手动包装,例如
from typing import NewType


DistAsc = NewType('DistAsc', list[int])


def returns_dist() -> DistAsc:
    return DistAsc([1, 2, 3])


def my_function(dist: DistAsc, clabels: list[int]):
    ...


my_function(returns_dist(), [])  # correct, no squiggles in editor
my_function([3, 2, 1], [])  # correct, squiggles in editor

my_function([1, 2, 3], [])  # incorrect, squiggles in editor
my_function(DistAsc([3, 2, 1]), [])  # incorrect, no squiggles in editor

请注意,这种方法有多种故障模式,并且其功能假设开发人员正在使用工作静态类型检查器(情况并非总是如此)。

如果您真的需要保证列表是有序的,那么请在您的函数中自行验证顺序,如果违反了您的假设,请提出

ValueError

重要的是要具体说明您期望的排序顺序(升序或降序)。确保它对读者来说是显而易见的。

© www.soinside.com 2019 - 2024. All rights reserved.