如何在 python 中解包(这个问题让人想起 rust)类型提示?或者换句话说,如何将
list[Optional[str]]
类型的变量变成
list[str]
?
问题:
我做了一个小函数来解释我的问题。
所以我从一个空列表开始,但在某些点(这里称为点 B)我想将我的列表传递给我的代码中的一些进一步处理。但前提是它具有价值。但是
Pylance
向我展示了一些错误。即使我知道此时列表不能为空。那么我要启动一个新选项吗?皮兰斯希望我将
def call_name(a_list:list[Optional[str]]):
also 的参数包装到一个选项中。但就像我此时所说的,我知道我的列表中有值,所以我不再需要
Optional
from typing import Optional
from random import randrange
async def test_me():
async def call_name(a_list:list[str]):
'''
This Function is only fired if the list is populated.
'''
for name in a_list:
print(f"Hello, {name}")
some_list:list[Optional[str]] = []
num = randrange(10)
# SOME PROCESSING
if 5 >= num:
# list gets populated
some_list= ["Ricky", "Joe", "Tyrone"]
else:
pass
if len(some_list) > 0:
# POINT B
await call_name(some_list) # <- Type Error
Pylance:
Argument of type "list[str | None]" cannot be assigned to parameter "some_list" of type "list[str]" in function "call_name"
"list[str | None]" is incompatible with "list[str]"
Type parameter "_T@list" is invariant, but "str | None" is not the same as "str"
Consider switching from "list" to "Sequence" which is covariantPylancereportArgumentType
你遇到的问题是类型检查器,在这种情况下是 Pylance,足够聪明,能够识别出你的列表
可能
包含
str
或
None
,即使你使用程序逻辑来确保在特定点它只包含字符串。
你有几个选项可以解决这个问题,而不会禁用类型提示,这在你想要获得类型提示的所有好处时是不可取的。
- 断言:
这是最直接的解决方案,你可以使用
assert
语句来断言
some_list
不包含
None
。如果断言失败,这将在运行时引发错误,让你知道你的逻辑中有问题。
```python from typing import Optional from random import randrange
async def test_me():
async def call_name(a_list: list[str]):
'''
此函数仅在列表填充时触发。
'''
for name in a_list:
print(f"你好,{name}")
some_list: list[Optional[str]] = []
num = randrange(10)
# 一些处理
if 5 >= num:
# 列表被填充
some_list = ["Ricky", "Joe", "Tyrone"]
else:
pass
if len(some_list) > 0:
# 断言列表不包含 None
assert all(isinstance(x, str) for x in some_list)
# B 点
await call_name(some_list)
```
- 列表推导式创建新列表:
你可以使用列表推导式来创建一个新列表,该列表仅包含
some_list
中的
str
元素。这将在技术上创建一个新列表,但如果你的列表不是很大,这应该不是问题。
```python from typing import Optional from random import randrange
async def test_me():
async def call_name(a_list: list[str]):
'''
此函数仅在列表填充时触发。
'''
for name in a_list:
print(f"你好,{name}")
some_list: list[Optional[str]] = []
num = randrange(10)
# 一些处理
if 5 >= num:
# 列表被填充
some_list = ["Ricky", "Joe", "Tyrone"]
else:
pass
if len(some_list) > 0:
# 创建一个仅包含字符串的新列表
str_list = [x for x in some_list if isinstance(x, str)]
# B 点
await call_name(str_list)
```
这些选项让你保留类型提示的好处,同时仍然满足类型检查器并清楚地传达你的意图。选择哪个选项取决于你的具体用例和偏好。
标签:python,python-3.x,python-typing,pylance From: 78814001