gpt4 book ai didi

Python 类型注释 : Mark item in tuple as optional

转载 作者:行者123 更新时间:2023-11-30 22:29:28 24 4
gpt4 key购买 nike

我有一个函数,它返回一个 2 元组,但也可以返回一个 3 元组。我如何用类型注释来描述这一点?

例如:

from typing import Tuple

def example(i):
# type: (int) -> Tuple[int, int, <what to put here?>]
if i < 10:
return (i, i+1, 1)
else:
return (i, i+1)

我可以像下面这样使用 Union,但看起来很困惑。

# type: (int) -> Union[Tuple[int, int], Tuple[int, int, int]]

最佳答案

正如评论中所指出的,联合可能是更好的方法。如果签名看起来比较乱,可以使用 type aliases像这样:

from typing import Tuple, Union

MyType = Union[Tuple[int, int], Tuple[int, int, int]]

def example1(i):
# type: (int) -> MyType
...snip...

另一种方法是使用 "indefinite length" Tuple type 。您基本上会放弃对元组的确切长度进行编码,但作为交换,可以规范化返回类型并避免该联合。 (如果您的代码确实依赖于长度,这可能不是最好的方法)。

def example2(i):
# type: (int) -> Tuple[int, ...]
...snip...

但是,一种更激进的方法是考虑重组代码以避免这种情况。

毕竟,如果您返回这两种不同的类型,函数的调用者可能仍然需要检查长度,对吗?

在这种情况下,一个想法是放弃返回元组,而是返回 NamedTuple或自定义类,两者都有一个可选字段。然后,您可以将“长度”检查转换为“此字段是否设置为无”检查。

我想,从某种意义上说,NamedTuple 方法也在某种程度上满足了您最初的要求,只要您不介意转换您的元组/增加的开销。

from typing import NamedTuple, Optional

MyType2 = NamedTuple('MyType2', (
('x', int),
('y', int),
('z', Optional[int]),
))

class MyType3(object):
def __init__(self, x, y, z):
# type: (int, int, Optional[int]) -> None
self.x = x
self.y = y
self.z = z

(一旦 PEP 557 被接受并集成到语言中,“自定义类”方法可能会更加优雅)。

如果您提前知道您期望哪种元组,则另一种方法是将您的函数分成两部分。然后,您可以调用适当类型的函数。

关于Python 类型注释 : Mark item in tuple as optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46355507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com