Digite dicas em namedtuple

127

Considere o seguinte código:

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

O Código acima é apenas uma forma de demonstrar o que estou tentando alcançar. Eu gostaria de fazer namedtupledicas de tipo.

Você conhece alguma maneira elegante de conseguir o resultado pretendido?

Pavel Hanpari
fonte
2
Além disso, começando com py3.7, você tem a opção dataclass
JohnE

Respostas:

151

A sintaxe preferida para uma tupla nomeada digitada desde 3.6 é

from typing import NamedTuple

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

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

Editar Iniciando Python 3.7, considere usar dataclasses(seu IDE pode ainda não suportá-los para verificação de tipo estático):

from dataclasses import dataclass

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

Point(3)  # -> Point(x=3, y=1)
Wolfgang Kuehn
fonte
12
@JohnE; O OP pediu especificamente tuplas nomeadas. Sim, muitos casos de uso de tuplas nomeadas serão melhor atendidos por classes de dados. Mas, para citar o excelente Why not namedtuples : Se você quiser uma tupla com nomes, por suposto: vá para uma tupla nomeada
Wolfgang Kuehn
1
Usando classes de dados, não é possível desconstruir o objeto resultante como você faria com uma Tupla
VARAK
6
Uma tupla é imutável. Uma classe de dados não é (por padrão) Ela tem o sinalizador congelado que se aproxima do comportamento da tupla. Apenas algo a ter em conta.
shao.lo
103

Você pode usar typing.NamedTuple

Dos documentos

Versão digitada de namedtuple.

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

Isso está presente apenas no Python 3.5 em diante

Bhargav Rao
fonte
Eu declarei assim: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])então eu tento geo = GeoPoint (** data) onde data é dict contendo chaves e valores necessários decimal.Decimal, e não ocorre conversão para flutuar; (nenhum typerror também :( :( então como isso typing.NamedTuplefunciona? Veja a essência .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs
8
A digitação @andi não impõe ou lança variáveis, afaik.
Bhargav Rao