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?


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)

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.