我正在使用返回单个元组的遗留代码,但更改后将返回原始元组,或具有附加值的另一个元组。基本上是这样的:
1 #!/usr/bin/python
2 from typing import Union
3
4 def func(x):
5 # type: (bool) -> Union[tuple[str, int], tuple[str, str, int]]
6 if x:
7 return "one", "two", 0
8 return "one", 0
9
10 one, two = func(False)
11 print(f"{one} {two}")
12 one, two, three = func(True)
13 print(f"{one} {two} {three}")
代码按预期工作:
$ ./tt.py
one 0
one two 0
但是当我在上面运行 mypy 时,我得到:
$ mypy tt.py
tt.py:10: error: Too many values to unpack (2 expected, 3 provided) [misc]
tt.py:11: error: Need more than 2 values to unpack (3 expected) [misc]
Found 2 errors in 1 file (checked 1 source file)
我是否遗漏了什么,或者这是 mypy 的问题吗?
Mypy 会给出错误,因为该函数可以返回两个或三个项目。如果输入是
True
,Mypy 不会推断它将是三个项目。
您可能正在寻找重载。这样,您可以输入,如果输入是
True
,则输出将是包含三个项目的元组;如果输入是 False
,则输出将是包含两个项目的元组。有关重载的更多信息,请参阅 https://docs.python.org/3/library/typing.html#overload。