首页 > 编程问答 >list[str] 是可迭代的吗?

list[str] 是可迭代的吗?

时间:2024-07-28 05:06:24浏览次数:13  
标签:python python-typing

Python 3.10 不这么认为:

Python 3.10.6 | packaged by conda-forge | (main, Aug 22 2022, 20:38:29) [Clang 13.0.1 ] \
    on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from typing import Iterable
>>> isinstance(list[str], Iterable)
False
>>> list(list[str])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'types.GenericAlias' object is not iterable

Python 3.11 认为它是:

Python 3.11.0 | packaged by conda-forge | (main, Jan 15 2023, 05:44:48) [Clang 14.0.6 ] \
    on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from typing import Iterable
>>> isinstance(list[str], Iterable)
True
>>> list(list[str])
[*list[str]]

如果它是一个可迭代对象,那么迭代它的结果应该是什么? *list[str] 项似乎是其自身或类型变量元组的 unpacking
这里发生了什么?我知道 python 中的输入处于不断变化和快速发展的状态,但我真的不知道如何解释这一点。


你对 Python 3.10 和 3.11 中行为差异的观察是正确的,解释与 Python 中类型提示的演变有关,特别是与 typing.GenericAlias 的引入有关。

Python 3.10 及更早版本

在 3.10 中, list[str] 等类型提示 未被视为可迭代的 isinstance(list[str], Iterable) 返回 False ,因为在运行时,它主要被视为 typing._GenericAlias (在旧版本中为 typing.GenericAlias )。它们没有实现 __iter__ 方法,因此不能被迭代。

Python 3.11

从 3.11 开始,对 typing.GenericAlias list[str] 等类型提示的底层类型)进行了更改,使其 可迭代 。此更改旨在允许在类型提示上下文中进行更强大的操作。

当你迭代 list[str] 时,你实际上是在迭代类型参数,在本例中只有一个: str 。因此, list(list[str]) 返回 [*list[str]] ,这基本上是类型参数的列表(使用 * 语法)。

发生了什么?

这种变化是 Python 类型提示逐渐成熟的一部分。使 typing.GenericAlias 可迭代,打开了一些可能性,尤其是在使用更复杂的类型提示和泛型时。

这是否意味着 list[str] 现在是一个可迭代的对象,就像一个字符串列表?

不完全是。虽然现在可以迭代 typing.GenericAlias 实例,但这并不意味着它们在运行时被视为常规的可迭代对象。迭代它们的结果是类型参数,而不是值的集合。

关键要点

  • list[str] 本身并不是一个字符串列表;它是一种类型提示,用于描述包含字符串的列表。
  • 从 Python 3.11 开始, typing.GenericAlias 实例(如 list[str] )是可迭代的,但它们迭代的是类型参数。
  • 此更改主要影响使用类型提示和泛型的代码,并且可能不会影响大多数日常 Python 代码。

我希望这能澄清一下!

标签:python,python-typing
From: 75695843

相关文章

  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......
  • python---字典遍历
    1、三种常见的字典遍历实现defget_key_value(dics):  '''遍历所有键值对'''  forkey,valueindics.items():    print(f"{key}:{value}")defget_keys(dics):  '''遍历所有的键'''  forkeyindics......
  • python基本语法三天速成系列day1(看完这篇你就会)
    注释注释是代码非常重要的一部分,它的主要作用有:解释代码目的:注释可以说明代码段或函数的目的和功能,帮助其他开发者快速理解代码的意图。复杂逻辑说明:对于复杂的算法或业务逻辑,通过注释可以解释这些逻辑是如何工作的,降低后续维护的难度。提高可读性:良好的注释可以使代码结......
  • Python学习笔记46:游戏篇之外星人入侵(七)
    前言到目前为止,我们已经完成了游戏窗口的创建,飞船的加载,飞船的移动,发射子弹等功能。很高兴的说一声,基础的游戏功能已经完成一半了,再过几天我们就可以尝试驾驶飞船击毁外星人了。当然,计分,游戏次数,背景音乐,开始启动等按钮的功能需要我们慢慢添加,这些功能不影响游戏的使用,影......