Cosa sono le "tuple nominate" in Python?


907

Leggendo le modifiche in Python 3.1 , ho trovato qualcosa di ... inaspettato:

La tupla sys.version_info è ora una tupla denominata :

Non avevo mai sentito parlare di tuple nominate prima e pensavo che gli elementi potessero essere indicizzati da numeri (come nelle tuple e negli elenchi) o da chiavi (come nei dadi). Non mi sarei mai aspettato che potessero essere indicizzati in entrambi i modi.

Pertanto, le mie domande sono:

  • Come si chiamano le tuple?
  • Come usarli?
  • Perché / quando dovrei usare le tuple nominate anziché le tuple normali?
  • Perché / quando dovrei usare le tuple normali invece delle tuple nominate?
  • Esiste un qualche tipo di "elenco dei nomi" (una versione mutabile della tupla nominata)?

Risposte:


1196

Le tuple nominate sono fondamentalmente tipi di oggetti leggeri e facili da creare. È possibile fare riferimento alle istanze di tuple denominate utilizzando il dereferenziamento variabile simile a un oggetto o la sintassi tupla standard. Possono essere usati in modo simile structo altri tipi di record comuni, tranne per il fatto che sono immutabili. Sono stati aggiunti in Python 2.6 e Python 3.0, anche se esiste una ricetta per l'implementazione in Python 2.4 .

Ad esempio, è comune rappresentare un punto come tupla (x, y). Questo porta a un codice come il seguente:

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)

Usando una tupla con nome diventa più leggibile:

from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)

Tuttavia, le tuple nominate sono ancora retrocompatibili con le tuple normali, quindi funzioneranno comunque:

Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
 # use tuple unpacking
x1, y1 = pt1

Pertanto, dovresti usare le tuple nominate anziché le tuple ovunque tu pensi che la notazione degli oggetti renderà il tuo codice più pitonico e più facilmente leggibile . Personalmente ho iniziato a usarli per rappresentare tipi di valore molto semplici, in particolare quando li passa come parametri alle funzioni. Rende le funzioni più leggibili, senza vedere il contesto del pacchetto di tuple.

Inoltre, puoi anche sostituire le normali classi immutabili che non hanno funzioni , ma solo campi con esse. Puoi anche usare i tuoi tipi di tupla nominati come classi base:

class Point(namedtuple('Point', 'x y')):
    [...]

Tuttavia, come per le tuple, gli attributi nelle tuple nominate sono immutabili:

>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute

Se si desidera poter modificare i valori, è necessario un altro tipo. Esiste una pratica ricetta per i tipi di record mutabili che consentono di impostare nuovi valori sugli attributi.

>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
    2.0

Non sono a conoscenza di alcuna forma di "elenco di nomi" che consente di aggiungere nuovi campi. Potresti semplicemente voler usare un dizionario in questa situazione. Le tuple nominate possono essere convertite in dizionari usando i pt1._asdict()ritorni {'x': 1.0, 'y': 5.0}e possono essere utilizzate con tutte le normali funzioni del dizionario.

Come già notato, è necessario controllare la documentazione per ulteriori informazioni da cui sono stati costruiti questi esempi.


35
da Python 3.7, considera anche i dataclass come un'alternativa (backport disponibile per 3.6, ma non versioni precedenti)
innov8

3
Nel caso in cui sia necessario un tipo di record modificabile - utilizzare la classe semplice con definita__slots__
madzohan

qual è la ragione principale per usare rcdtype non dataclasses
Voyager

Alternativa a dict è dizionario attributo stackoverflow.com/questions/4984647/...
mrgloom

Poiché questa è la risposta che trovi sempre, vale la pena ricordare che ora esiste anche un typing.NamedTuplemetodo che consente suggerimenti sul tipo ed è particolarmente conveniente per la sottoclasse.
DerWeh,

101

namedtuple è una funzione di fabbrica per creare una classe tupla. Con quella classe possiamo creare tuple richiamabili anche per nome.

import collections

#Create a namedtuple class with names "a" "b" "c"
Row = collections.namedtuple("Row", ["a", "b", "c"], verbose=False, rename=False)   

row = Row(a=1,b=2,c=3) #Make a namedtuple from the Row class we created

print row    #Prints: Row(a=1, b=2, c=3)
print row.a  #Prints: 1
print row[0] #Prints: 1

row = Row._make([2, 3, 4]) #Make a namedtuple from a list of values

print row   #Prints: Row(a=2, b=3, c=4)

5
i parametri verbose e rename sono impostati su False per impostazione predefinita, quindi non è necessario impostarli su questo valore in modo esplicito.
Trismegistos,

namedtuple is a factory function for making a tuple class.questa è probabilmente l'unica risposta corretta qui: P
Mr_and_Mrs_D

90

Come si chiamano le tuple?

Una tupla nominata è una tupla.

Fa tutto ciò che una tupla può fare.

Ma è più di una semplice tupla.

È una sottoclasse specifica di una tupla creata a livello di programmazione in base alle specifiche, con campi con nome e lunghezza fissa.

Questo, ad esempio, crea una sottoclasse di tupla e, oltre a essere di lunghezza fissa (in questo caso, tre), può essere usata ovunque una tupla viene utilizzata senza rompersi. Questa è nota come sostituibilità di Liskov.

Nuovo in Python 3.6 , possiamo usare una definizione di classe contyping.NamedTupleper creare una namedtuple:

from typing import NamedTuple

class ANamedTuple(NamedTuple):
    """a docstring"""
    foo: int
    bar: str
    baz: list

Quanto sopra è lo stesso di quello sotto, tranne per il fatto che sopra ha anche annotazioni di tipo e un dotstring. Di seguito è disponibile in Python 2+:

>>> from collections import namedtuple
>>> class_name = 'ANamedTuple'
>>> fields = 'foo bar baz'
>>> ANamedTuple = namedtuple(class_name, fields)

Questo lo istanzia:

>>> ant = ANamedTuple(1, 'bar', [])

Possiamo ispezionarlo e usare i suoi attributi:

>>> ant
ANamedTuple(foo=1, bar='bar', baz=[])
>>> ant.foo
1
>>> ant.bar
'bar'
>>> ant.baz.append('anything')
>>> ant.baz
['anything']

Spiegazione più approfondita

Per capire le tuple nominate, devi prima sapere cos'è una tupla. Una tupla è essenzialmente un elenco immutabile (non può essere modificato sul posto in memoria).

Ecco come potresti usare una tupla normale:

>>> student_tuple = 'Lisa', 'Simpson', 'A'
>>> student_tuple
('Lisa', 'Simpson', 'A')
>>> student_tuple[0]
'Lisa'
>>> student_tuple[1]
'Simpson'
>>> student_tuple[2]
'A'

Puoi espandere una tupla con il disimballaggio iterabile:

>>> first, last, grade = student_tuple
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'

Le tuple nominate sono tuple a cui è possibile accedere ai loro elementi per nome anziché semplicemente per indice!

Fai una coppia con nome come questa:

>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['first', 'last', 'grade'])

Puoi anche utilizzare una singola stringa con i nomi separati da spazi, un uso leggermente più leggibile dell'API:

>>> Student = namedtuple('Student', 'first last grade')

Come usarli?

Puoi fare tutto ciò che le tuple possono fare (vedi sopra) e fare quanto segue:

>>> named_student_tuple = Student('Lisa', 'Simpson', 'A')
>>> named_student_tuple.first
'Lisa'
>>> named_student_tuple.last
'Simpson'
>>> named_student_tuple.grade
'A'
>>> named_student_tuple._asdict()
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> vars(named_student_tuple)
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> new_named_student_tuple = named_student_tuple._replace(first='Bart', grade='C')
>>> new_named_student_tuple
Student(first='Bart', last='Simpson', grade='C')

Un commentatore ha chiesto:

In uno script o programma di grandi dimensioni, dove di solito si definisce una tupla con nome?

I tipi con cui crei namedtuplesono fondamentalmente le classi che puoi creare con una scorciatoia facile. Trattali come se fossero delle lezioni. Definiscili a livello di modulo, in modo che Pickle e altri utenti possano trovarli.

L'esempio funzionante, a livello di modulo globale:

>>> from collections import namedtuple
>>> NT = namedtuple('NT', 'foo bar')
>>> nt = NT('foo', 'bar')
>>> import pickle
>>> pickle.loads(pickle.dumps(nt))
NT(foo='foo', bar='bar')

E questo dimostra l'incapacità di cercare la definizione:

>>> def foo():
...     LocalNT = namedtuple('LocalNT', 'foo bar')
...     return LocalNT('foo', 'bar')
... 
>>> pickle.loads(pickle.dumps(foo()))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class '__main__.LocalNT'>: attribute lookup LocalNT on __main__ failed

Perché / quando dovrei usare le tuple nominate anziché le tuple normali?

Usali quando migliora il tuo codice per avere la semantica degli elementi tupla espressa nel tuo codice.

Puoi usarli invece di un oggetto se altrimenti utilizzeresti un oggetto con attributi di dati invariati e nessuna funzionalità.

Puoi anche sottoclassarli per aggiungere funzionalità, ad esempio :

class Point(namedtuple('Point', 'x y')):
    """adding functionality to a named tuple"""
        __slots__ = ()
        @property
        def hypot(self):
            return (self.x ** 2 + self.y ** 2) ** 0.5
        def __str__(self):
            return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)

Perché / quando dovrei usare le tuple normali invece delle tuple nominate?

Probabilmente sarebbe una regressione passare dall'uso delle tuple nominate alle tuple. La decisione di progettazione iniziale si basa sul fatto che il costo derivante dal codice aggiuntivo in questione valga la leggibilità migliorata quando viene utilizzata la tupla.

Non esiste memoria aggiuntiva utilizzata dalle tuple nominate rispetto alle tuple.

Esiste un qualche tipo di "elenco dei nomi" (una versione mutabile della tupla nominata)?

Stai cercando un oggetto scanalato che implementa tutte le funzionalità di un elenco di dimensioni statiche o un elenco di sottoclassi che funziona come una tupla denominata (e che in qualche modo impedisce all'elenco di cambiare dimensioni).

Un esempio ora ampliato, e forse addirittura sostituibile di Liskov, del primo:

from collections import Sequence

class MutableTuple(Sequence): 
    """Abstract Base Class for objects that work like mutable
    namedtuples. Subclass and define your named fields with 
    __slots__ and away you go.
    """
    __slots__ = ()
    def __init__(self, *args):
        for slot, arg in zip(self.__slots__, args):
            setattr(self, slot, arg)
    def __repr__(self):
        return type(self).__name__ + repr(tuple(self))
    # more direct __iter__ than Sequence's
    def __iter__(self): 
        for name in self.__slots__:
            yield getattr(self, name)
    # Sequence requires __getitem__ & __len__:
    def __getitem__(self, index):
        return getattr(self, self.__slots__[index])
    def __len__(self):
        return len(self.__slots__)

E per usare, basta sottoclassare e definire __slots__:

class Student(MutableTuple):
    __slots__ = 'first', 'last', 'grade' # customize 


>>> student = Student('Lisa', 'Simpson', 'A')
>>> student
Student('Lisa', 'Simpson', 'A')
>>> first, last, grade = student
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'
>>> student[0]
'Lisa'
>>> student[2]
'A'
>>> len(student)
3
>>> 'Lisa' in student
True
>>> 'Bart' in student
False
>>> student.first = 'Bart'
>>> for i in student: print(i)
... 
Bart
Simpson
A

44

nametuples sono un'ottima funzionalità, sono un contenitore perfetto per i dati. Quando devi "archiviare" i dati dovresti usare tuple o dizionari, come:

user = dict(name="John", age=20)

o:

user = ("John", 20)

L'approccio del dizionario è travolgente, poiché il dict è mutevole e più lento delle tuple. D'altra parte, le tuple sono immutabili e leggere ma mancano di leggibilità per un gran numero di voci nei campi di dati.

nametuples sono il compromesso perfetto per i due approcci, hanno una grande leggibilità, leggerezza e immutabilità (in più sono polimorfici!).


9
Tieni presente che le coppie con nome sono molto più lente dei dadi se accedi ai loro attributi per nome: ntuple.foorispetto a ntuple[1]quest'ultimo è molto più veloce. Altre informazioni: stackoverflow.com/questions/2646157/…
Rotareti

28

le tuple denominate consentono la retrocompatibilità con il codice che verifica la versione in questo modo

>>> sys.version_info[0:2]
(3, 1)

consentendo nel contempo che il codice futuro sia più esplicito utilizzando questa sintassi

>>> sys.version_info.major
3
>>> sys.version_info.minor
1

12

namedtuple

è uno dei modi più semplici per ripulire il codice e renderlo più leggibile. Auto-documenta ciò che sta accadendo nella tupla. Le istanze di Namedtuples sono altrettanto efficienti in termini di memoria delle normali tuple in quanto non hanno dizionari per istanza, rendendoli più veloci dei dizionari.

from collections import namedtuple

Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])

 p = Color(170, 0.1, 0.6)
 if p.saturation >= 0.5:
     print "Whew, that is bright!"
 if p.luminosity >= 0.5:
     print "Wow, that is light"

Senza nominare ogni elemento nella tupla, si legge così:

p = (170, 0.1, 0.6)
if p[1] >= 0.5:
    print "Whew, that is bright!"
if p[2]>= 0.5:
   print "Wow, that is light"

È molto più difficile capire cosa sta succedendo nel primo esempio. Con una namedtuple, ogni campo ha un nome. E puoi accedervi per nome anziché per posizione o indice. Invece di p[1], possiamo chiamarlo p.saturation. È più facile da capire E sembra più pulito.

La creazione di un'istanza della namedtuple è più semplice della creazione di un dizionario.

# dictionary
>>>p = dict(hue = 170, saturation = 0.1, luminosity = 0.6)
>>>p['hue']
170

#nametuple
>>>from collections import namedtuple
>>>Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])
>>>p = Color(170, 0.1, 0.6)
>>>p.hue
170

Quando potresti usare namedtuple

  1. Come appena detto, la namedtuple rende molto più semplice la comprensione delle tuple. Quindi, se hai bisogno di fare riferimento agli elementi nella tupla, crearli come tuple con nome ha senso.
  2. Oltre ad essere più leggero di un dizionario, namedtuple mantiene anche l'ordine diverso dal dizionario.
  3. Come nell'esempio sopra, è più semplice creare un'istanza di namedtuple rispetto al dizionario. E fare riferimento all'elemento nella tupla nominata sembra più pulito di un dizionario. p.huepiuttosto che p['hue'].

La sintassi

collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
  • namedtuple si trova nella libreria delle raccolte.
  • typename: questo è il nome della nuova sottoclasse tupla.
  • field_names: una sequenza di nomi per ciascun campo. Può essere una sequenza come in un elenco ['x', 'y', 'z']o stringa x y z(senza virgole, solo spazi) o x, y, z.
  • rinomina: se si rinomina True, i nomi dei campi non validi vengono automaticamente sostituiti con nomi posizionali. Ad esempio, ['abc', 'def', 'ghi','abc']viene convertito in ['abc', '_1', 'ghi', '_3'], eliminando la parola chiave 'def'(poiché si tratta di una parola riservata per la definizione di funzioni) e il nome campo duplicato'abc' .
  • verbose: se verbose lo è True, la definizione della classe viene stampata appena prima di essere costruita.

Se lo desideri, puoi comunque accedere alle denominazioni delle coppie in base alla loro posizione. p[1] == p.saturation. Si decomprime ancora come una normale tupla.

metodi

Sono supportati tutti i metodi di tupla regolari . Es: min (), max (), len (), in, non in, concatenazione (+), index, slice, ecc. E ce ne sono alcuni aggiuntivi per namedtuple. Nota: tutti iniziano con un carattere di sottolineatura. _replace, _make, _asdict.

_replace Restituisce una nuova istanza della tupla nominata sostituendo i campi specificati con nuovi valori.

La sintassi

somenamedtuple._replace(kwargs)

Esempio

>>>from collections import namedtuple

>>>Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])
>>>p = Color(170, 0.1, 0.6)

>>>p._replace(hue=87)
Color(87, 0.1, 0.6)

>>>p._replace(hue=87, saturation=0.2)
Color(87, 0.2, 0.6)

Avviso : i nomi dei campi non sono tra virgolette; sono parole chiave qui. Ricorda : le tuple sono immutabili, anche se sono denominate coppie e hanno il _replacemetodo. The _replaceproduce newun'istanza; non modifica l'originale né sostituisce il vecchio valore. Ovviamente puoi salvare il nuovo risultato nella variabile.p = p._replace(hue=169)

_make

Crea una nuova istanza da una sequenza esistente o iterabile.

La sintassi

somenamedtuple._make(iterable)

Esempio

 >>>data = (170, 0.1, 0.6)
 >>>Color._make(data)
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make([170, 0.1, 0.6])  #the list is an iterable
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make((170, 0.1, 0.6))  #the tuple is an iterable
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make(170, 0.1, 0.6) 
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "<string>", line 15, in _make
TypeError: 'float' object is not callable

Cosa è successo con l'ultimo? L'articolo tra parentesi dovrebbe essere iterabile. Quindi un elenco o una tupla all'interno della parentesi funziona, ma la sequenza di valori senza racchiuderlo come iterabile restituisce un errore.

_asdict

Restituisce un nuovo OrderedDict che associa i nomi dei campi ai valori corrispondenti.

La sintassi

somenamedtuple._asdict()

Esempio

 >>>p._asdict()
OrderedDict([('hue', 169), ('saturation', 0.1), ('luminosity', 0.6)])

Riferimento : https://www.reddit.com/r/Python/comments/38ee9d/intro_to_namedtuple/

C'è anche un elenco di nomi che è simile al nome di tupla ma mutevole https://pypi.python.org/pypi/namedlist


Si noti tuttavia che, secondo PEP8, un singolo carattere di sottolineatura è considerato un indicatore "debole" di uso interno " con il proprio comportamento. Attento quando si utilizzano le funzioni che iniziano con _!
Jens,

8

Cosa si chiama tupla?

Come suggerisce il nome, namedtuple è una tupla con nome. Nella tupla standard, accediamo agli elementi utilizzando l'indice, mentre namedtuple consente all'utente di definire il nome per gli elementi. Questo è molto utile specialmente per l'elaborazione di file CSV (valori separati da virgola) e per lavorare con set di dati complessi e di grandi dimensioni, in cui il codice diventa disordinato con l'uso di indici (non così pitonici).

Come usarli?

>>>from collections import namedtuple
>>>saleRecord = namedtuple('saleRecord','shopId saleDate salesAmout totalCustomers')
>>>
>>>
>>>#Assign values to a named tuple 
>>>shop11=saleRecord(11,'2015-01-01',2300,150) 
>>>shop12=saleRecord(shopId=22,saleDate="2015-01-01",saleAmout=1512,totalCustomers=125)

Lettura

>>>#Reading as a namedtuple
>>>print("Shop Id =",shop12.shopId)
12
>>>print("Sale Date=",shop12.saleDate)
2015-01-01
>>>print("Sales Amount =",shop12.salesAmount)
1512
>>>print("Total Customers =",shop12.totalCustomers)
125

Scenario interessante nell'elaborazione CSV:

from csv import reader
from collections import namedtuple

saleRecord = namedtuple('saleRecord','shopId saleDate totalSales totalCustomers')
fileHandle = open("salesRecord.csv","r")
csvFieldsList=csv.reader(fileHandle)
for fieldsList in csvFieldsList:
    shopRec = saleRecord._make(fieldsList)
    overAllSales += shopRec.totalSales;

print("Total Sales of The Retail Chain =",overAllSales)

5

In Python all'interno c'è un buon uso del contenitore chiamato tupla denominata, può essere usato per creare una definizione di classe e ha tutte le caratteristiche della tupla originale.

L'uso della tupla con nome verrà applicato direttamente al modello di classe predefinito per generare una classe semplice, questo metodo consente a un sacco di codice di migliorare la leggibilità ed è anche molto comodo quando si definisce una classe.


2

Un altro modo (un nuovo modo) per usare la tupla denominata è usare NamedTuple dal pacchetto di battitura: digitare suggerimenti in namedtuple

Usiamo l'esempio della risposta principale in questo post per vedere come usarlo.

(1) Prima di usare la tupla nominata, il codice è così:

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
print(line_length)

(2) Ora usiamo la tupla nominata

from typing import NamedTuple, Number

ereditare la classe NamedTuple e definire il nome della variabile nella nuova classe. test è il nome della classe.

class test(NamedTuple):
x: Number
y: Number

crea istanze dalla classe e assegna loro dei valori

pt1 = test(1.0, 5.0)   # x is 1.0, and y is 5.0. The order matters
pt2 = test(2.5, 1.5)

utilizzare le variabili dalle istanze per calcolare

line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)
print(line_length)

1

Prova questo:

collections.namedtuple()

Fondamentalmente, namedtuplessono facili da creare, tipi di oggetti leggeri. Trasformano le tuple in comodi contenitori per compiti semplici. Connamedtuples , non è necessario utilizzare indici interi per accedere ai membri di una tupla.

Esempi:

Codice 1:

>>> from collections import namedtuple

>>> Point = namedtuple('Point','x,y')

>>> pt1 = Point(1,2)

>>> pt2 = Point(3,4)

>>> dot_product = ( pt1.x * pt2.x ) +( pt1.y * pt2.y )

>>> print dot_product
11

Codice 2:

>>> from collections import namedtuple

>>> Car = namedtuple('Car','Price Mileage Colour Class')

>>> xyz = Car(Price = 100000, Mileage = 30, Colour = 'Cyan', Class = 'Y')

>>> print xyz

Car(Price=100000, Mileage=30, Colour='Cyan', Class='Y')
>>> print xyz.Class
Y

-1

Tutti gli altri hanno già risposto, ma penso di avere ancora qualcos'altro da aggiungere.

Namedtuple può essere intuitivamente considerato una scorciatoia per definire una classe.

Vedi un modo ingombrante e convenzionale per definire a class.

class Duck:
    def __init__(self, color, weight):
        self.color = color
        self.weight = weight
red_duck = Duck('red', '10')

    In [50]: red_duck
    Out[50]: <__main__.Duck at 0x1068e4e10>
    In [51]: red_duck.color
    Out[51]: 'red'

Quanto a namedtuple

from collections import namedtuple
Duck = namedtuple('Duck', ['color', 'weight'])
red_duck = Duck('red', '10')

In [54]: red_duck
Out[54]: Duck(color='red', weight='10')
In [55]: red_duck.color
Out[55]: 'red'

2
Siamo spiacenti, ma questo è sbagliato. La tupla nominata supporta anche questi: red_duck[0]oppure len(red_duck)oppure for x in red_duck: print(x). Inoltre, le tuple nominate sono immutabili, quindi queste operazioni falliranno: red_duck[0] = 2, red_duck.foo = 'bar'. Poiché sono immutabili, le tuple nominate possono essere utilizzate come dictchiavi.
Denilson Sá Maia,

Sì, sono le basi.
Calcolo

1
@JawSaw No, non sono le "basi". Le tuple nominate supportano un set di funzionalità completamente diverso rispetto alle classi normali. Mentre in sostanza le tuple denominate sono una classe, ciò non significa che le classi siano chiamate tuple.
connectyourcharger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.