当前位置: 首页 > 知识库问答 >
问题:

在namedtuple中键入提示

郜琦
2023-03-14

请考虑以下代码段:

from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))

上面的代码只是一种方式来证明我试图实现什么。我想用类型提示创建< code>namedtuple。

你知道怎样才能达到预期的效果吗?

共有3个答案

白星腾
2023-03-14

公平地说,NamedTuple来自键入:

>>> from typing import NamedTuple
>>> class Point(NamedTuple):
...     x: int
...     y: int = 1  # Set default value
...
>>> Point(3)
Point(x=3, y=1)

等于经典namedtuple

>>> from collections import namedtuple
>>> p = namedtuple('Point', 'x,y', defaults=(1, ))
>>> p.__annotations__ = {'x': int, 'y': int}
>>> p(3)
Point(x=3, y=1)

因此,< code>NamedTuple只是< code>namedtuple的语法糖

下面,您可以从< code>python 3.10的源代码中找到一个正在创建的< code>NamedTuple函数。如我们所见,它使用< code > collections . named tuple 构造函数,并从提取的类型中添加< code>__annotations__:

def _make_nmtuple(name, types, module, defaults = ()):
    fields = [n for n, t in types]
    types = {n: _type_check(t, f"field {n} annotation must be a type")
             for n, t in types}
    nm_tpl = collections.namedtuple(name, fields,
                                    defaults=defaults, module=module)
    nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
    return nm_tpl
佘缪文
2023-03-14

您可以使用键入。NamedTuple

从文档

namedtuple的键入版本。

>>> import typing
>>> Point = typing.NamedTuple("Point", [('x', int), ('y', int)])

这仅在Python 3.5以后的版本中存在

龚招
2023-03-14

自3.6以来类型化命名元组的首选语法是

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int = 1  # Set default value

Point(3)  # -> Point(x=3, y=1)

编辑 开始 Python 3.7,请考虑使用数据(您的 IDE 可能尚不支持它们进行静态类型检查):

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int = 1  # Set default value

Point(3)  # -> Point(x=3, y=1)
 类似资料:
  • 问题内容: 考虑以下代码: 上面的代码只是演示我正在尝试实现的方法。我想使用类型提示。 您知道如何以一种优雅的方式达到预期效果吗? 问题答案: 自3.6以来,类型化命名元组的首选语法为 编辑 从Python 3.7开始,请考虑使用(您的IDE可能尚不支持它们进行静态类型检查):

  • 使用python 3,可以选择使用类型符号。 我的问题是,如果一个函数返回None,应该加上这个,还是留空。 即 哪个PEP解决了这个问题?

  • 有没有办法告诉WebStom在AngularJS(v1)组件超文本标记语言模板文件中哪个类型? 如果它是一个JavaScript文件,我可以使用JSDoc,WebStorm会使用该信息,并会正确检测未使用的方法等。 WebStorm的文档讲述了Angular插件,但该插件似乎无法与较新的AngularJS组件一起工作,只能与较旧的< code>ng-controller样式一起工作。

  • 问题内容: 长话短说 PEP-557在Python标准库中引入了数据类,该类基本上可以充当和的角色。现在,我想知道如何将用例分隔,其中namedtuple仍然是更好的解决方案。 数据类优于NamedTuple 当然,如果需要,所有功劳都归功于: 可变对象 继承支持 装饰器,可管理的属性 现成的方法定义或可自定义的方法定义 在同一PEP中简要说明了数据类的优点:为什么不只使用namedtuple。

  • 问题内容: 这似乎是一个常见问题,但是我在Google或SO上都找不到。如果找到一篇,请给我指出这篇文章。 我如何在bash提示符(当您按ENTER键时)中插入新行,类似于Windows提示符? Linux: 视窗: 我之间需要额外的空间。 问题答案: 更改PS1 Bash提示变量:

  • 我有一个通用记录,如下所示,其中是一个值为字符串的映射。 下面是holder map的数据: 我想提取字符串和字符串映射中的holder数据。我不知道该怎么做?我尝试了两个选项,如下所示: 此返回对象: 这返回一个Map,但我看不出它是一个键和值的Map。 当我打印时,我看到这样的情况,这显然不是键/值的映射。我做错了什么?以及如何从GenericRecord中提取键入的映射?