2012-05-07 2 views
8

Каково использование typename, связанного с определенным классом? Например,Использование типов классов классов в python

Point = namedtuple('P', ['x', 'y']) 

Где бы вы обычно используете TYPENAME 'P'?

Спасибо!

+0

Возможный дубликат [Что такое «названные кортежи» в Python?] (Http://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python) – b4hand

ответ

13

Просто ради здравомыслия, первый аргумент namedtuple должен быть таким же, как имя переменной присвоить его:

>>> from collections import namedtuple 
>>> Point = namedtuple('P','x y') 
>>> pp = Point(1,2) 
>>> type(pp) 
<class '__main__.P'> 

isinstance не слишком обеспокоен этим, хотя только что «P» не известно:

>>> isinstance(pp,Point) 
True 
>>> isinstance(pp,P) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'P' is not defined 

Но рассол один модуль, который заботится о поиске имя класса, который соответствует TypeName:

>>> import pickle 
>>> ppp = pickle.dumps(pp) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\python26\lib\pickle.py", line 1366, in dumps 
    Pickler(file, protocol).dump(obj) 
    File "c:\python26\lib\pickle.py", line 224, in dump 
    self.save(obj) 
    File "c:\python26\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "c:\python26\lib\pickle.py", line 401, in save_reduce 
    save(args) 
    File "c:\python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "c:\python26\lib\pickle.py", line 562, in save_tuple 
    save(element) 
    File "c:\python26\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "c:\python26\lib\pickle.py", line 748, in save_global 
    (obj, module, name)) 
pickle.PicklingError: Can't pickle <class '__main__.P'>: it's not found as __main__.P 

Если я определяю namedtuple как «точка», то рассол счастлив:

>>> Point = namedtuple('Point','x y') 
>>> pp = Point(1,2) 
>>> ppp = pickle.dumps(pp) 
>>> 

К сожалению, это до вас, чтобы справиться с этой последовательности. Невозможно, чтобы namedtuple знал, для чего вы назначаете его вывод, поскольку назначение - это оператор, а не оператор в Python, поэтому вам нужно передать правильное имя класса в namedtuple и назначить результирующий класс переменной того же имя.

+1

вам не нужен ' .split() 'в именах полей, это [сделано автоматически] (http://docs.python.org/library/collections#collections.namedtuple), если вы укажете имена в виде строки. в противном случае +1 – mata

+0

А, спасибо! Я не использовал namedtuple через некоторое время, просто подражал формату OP. Я делаю что-то очень похожее в функции 'oneOf' pyparsing. – PaulMcG

+3

Существует также по умолчанию 'repr': вы хотите' Point (x = 1, y = 2) ', а не' P (x = 1, y = 2) '. –

Смежные вопросы