2016-01-23 12 views
6
dokumentacja

Python mówi:Jaka jest różnica między zwracaniem nazwokresowym a jego typename?

collections.namedtuple(typename, field_names[, verbose=False][, rename=False]) 
Returns a new tuple subclass named typename. 

i daje przykład

>>>Point = namedtuple('Point', ...

We wszystkich przykładach udało mi się znaleźć, powrót z namedtuple i argumentów typename pisane są takie same.

eksperymentowanie, wydaje się, że argument ten nie ma znaczenia:

>>>Class = collections.namedtuple('Junk', 'field') 
>>>obj = Class(field=1) 
>>>print obj.field 
1 

Jaka jest różnica? Jak ważny jest argument typename?

Odpowiedz

8

Kiedy wykonać następujący kod:

Bar = collections.namedtuple('Foo', 'field') 

jesteś:

  1. tworzenia nowego typu o nazwie Foo;
  2. przypisanie tego typu do zmiennej o nazwie Bar.

Ten kod jest równoważne to:

class Foo: 
    ... 

Bar = Foo 
del Foo 

Nawet jeśli przypisać klasę do zmiennej z inną nazwą, Foo nadal będzie „oficjalna” nazwa, czyli: Bar.__name__ będzie nadal być 'Foo'.

Zobaczysz różnicę podczas drukowania albo klasę lub instancję:

>>> Bar = collections.namedtuple('Foo', 'field') 
>>> obj = Bar(field=1) 
>>> obj 
Foo(field=1) 

Można zapytać dlaczego namedtuple wymaga nazwy typu, gdyż jest zbędny (ze zwykłej konwencji). Cóż, namedtuple buduje typ przed przypisaną zmiennej, więc nie może wywnioskować nazwy typu i musi zostać wyraźnie poinformowany. (Albo lepiej: może wywnioskować nazwę przez sprawdzenie kodu dzwoniącego, ale to jest hack i nie zadziała w niekonwencjonalnych przypadkach).

+0

wybacz mi, ale tego nie rozumiem. Dlaczego dwie rzeczy? Dlaczego potrzebujemy zarówno oficjalnej nazwy, jak i zmiennej o potencjalnie innej nazwie? –

+0

@MarkGaleck: zaktualizowana odpowiedź –

Powiązane problemy