Escriba sugerencias en namedtuple

127

Considere el siguiente fragmento de código:

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

El Código anterior es solo una forma de demostrar lo que estoy tratando de lograr. Me gustaría hacer namedtuplecon sugerencias tipográficas.

¿Conoce alguna manera elegante de lograr el resultado previsto?

Pavel Hanpari
fuente
2
Además, comenzando con py3.7 tiene la opción de clase de datos
JohnE

Respuestas:

151

La sintaxis preferida para una tupla con nombre escrita desde 3.6 es

from typing import NamedTuple

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

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

Editar A partir de Python 3.7, considere usar dataclasses(es posible que su IDE aún no los admita para la verificación de tipos estáticos):

from dataclasses import dataclass

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

Point(3)  # -> Point(x=3, y=1)
Wolfgang Kuehn
fuente
12
@JohnE; El OP pidió específicamente tuplas con nombre. Sí, muchas clases de datos servirán mejor a muchos casos de uso de tuplas con nombre. Pero para citar el excelente Por qué no nombrar tuplas : si quieres una tupla con nombres, por
Wolfgang Kuehn
1
Usando clases de datos, no es posible deconstruir el objeto resultante como lo
haría con
6
Una tupla es inmutable. Una clase de datos no lo es (por defecto) Tiene la bandera congelada que se acerca al comportamiento de la tupla. Solo algo a tener en cuenta.
shao.lo
103

Puedes usar typing.NamedTuple

De los documentos

Versión mecanografiada de namedtuple.

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

Esto está presente solo en Python 3.5 en adelante

Bhargav Rao
fuente
Lo declaré así: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])luego intento geo = GeoPoint (** datos) donde los datos son dictados que contienen las claves y los valores necesarios decimal.Decimal, y no ocurre ningún lanzamiento para flotar; (tampoco hay error de tipo :( :( entonces, ¿cómo typing.NamedTuplefunciona esto ? Ver la esencia .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs
8
@andi typing no impone ni lanza variables, afaik.
Bhargav Rao