首页 > 编程问答 >如何从类型提示中删除Optional?

如何从类型提示中删除Optional?

时间:2024-07-31 07:46:16浏览次数:8  
标签:python python-3.x python-typing pylance

如何在 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 ,即使你使用程序逻辑来确保在特定点它只包含字符串。

你有几个选项可以解决这个问题,而不会禁用类型提示,这在你想要获得类型提示的所有好处时是不可取的。

  1. 断言:

这是最直接的解决方案,你可以使用 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)

```

  1. 列表推导式创建新列表:

你可以使用列表推导式来创建一个新列表,该列表仅包含 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

相关文章

  • 激活虚拟环境会让python消失?
    VisualStudioCode终端的屏幕截图如屏幕截图所示,python在Powershell中运行得很好。然后我在E:\DrewFTCAPI\ftcapivenv激活虚拟环境,然后python就消失了。不仅没有消失,它不运行任何东西,也不产生任何输出。我至少预计会出现某种类型的"python"i......
  • Python 3.6 中的相互递归类型,使用命名元组语法
    我正在尝试实现图的节点和边。这是我的代码:fromtypingimportNamedTuple,ListclassNode(NamedTuple):name:stredges:List[Edge]classEdge(NamedTuple):src:Nodedest:Node这会引发错误,因为创建Edge时未定义Node类型。......
  • 使用 keras 模型对函数进行 Python 类型提示
    如果我创建这样的函数:defmdl(input_shape):model=Sequential()model.add(Conv2D(depth=64,kernel_size=(3,3),input_shape=input_shape,activation='relu'))model.add(Dense(32),activation='relu')model.add(Dropout(0.3))m......
  • Python:自动完成可以用于列表中的元素吗?
    Python在函数参数和函数返回类型中具有类型提示。类的元素是否有类似的东西?我希望能够在如下示例中使用自动完成功能:classMyClass:defhello(self):print("Hello")mylist=[]mylist.append(MyClass())foriinmylist:i.hello()#Noautocomplete......
  • python 中 COM 对象的正确类型提示是什么?
    我在python中使用COM对象来向3rd方软件公开可编程接口。这是通过使用Dispatchfromwin32com.client来实现的。我的项目也一直在使用python.3.7中的类型提示,但是我不确定如何为了类型提示的目的定义这些COM对象的类型。这个问题涉及我拥有的所有COM......
  • 如何遍历Python字典同时避免KeyErrors?
    解析大型JSON时,某些键可能仅在某些情况下存在,例如出现错误时。从服务器的API获取200OK的情况并不少见,但是您得到的响应包含应检查的错误。处理此问题的最佳方法是什么?我知道使用类似||之类的东西。|是处理KeyError的一种方法。get()但是如果......
  • Python 中的递归数据类型
    Python中最接近Haskell中的递归数据类型的是什么?(即在定义自身时使用类型自己的定义。)编辑:为了给出递归类型的更具体定义,下面是Haskell中的二叉树:dataTreea=Leafa|Branch(Treea)(Treea)我的阅读方式如下:二叉树可以是叶子,也可以包含两......
  • 如何在Python中平滑相邻的多边形?
    我正在寻找一种平滑多边形的方法,以便相邻/接触的多边形保持接触。单个多边形可以轻松平滑,例如使用PAEK或Bezier插值(https://pro.arcgis.com/en/pro-app/latest/tool-reference/cartography/smooth-polygon.htm),这自然会改变它们的边界边缘。但是如何平滑所有多边形......
  • Python多处理池不启动多个进程
    我正在尝试使用多处理池来创建多个进程。我有一个工作函数dummy_proc定义如下:importrefrommultiprocessingimportPooldefregex_check(input_string):#Patterntomatchboth"pm_lat"and"pm_lon_coslat"followedbytwofloatspattern=r"(c......
  • 迟滞建模作为 Python GEKKO 中 MPC 的控制约束
    我试图使用PythonGEKKO在用于控制信号调度的MPC优化问题中引入滞后约束。这已成为一项艰巨的任务,因为我无法将以下问题转换为GEKKO理解的方程。问题:如果开启时间<最短开启时间,则给定资产的控制调度不应将其关闭。如果关闭时间<最小关闭时间......