Каково использование typename, связанного с определенным классом? Например,Использование типов классов классов в python
Point = namedtuple('P', ['x', 'y'])
Где бы вы обычно используете TYPENAME 'P'?
Спасибо!
Каково использование typename, связанного с определенным классом? Например,Использование типов классов классов в python
Point = namedtuple('P', ['x', 'y'])
Где бы вы обычно используете TYPENAME 'P'?
Спасибо!
Просто ради здравомыслия, первый аргумент 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 и назначить результирующий класс переменной того же имя.
вам не нужен ' .split() 'в именах полей, это [сделано автоматически] (http://docs.python.org/library/collections#collections.namedtuple), если вы укажете имена в виде строки. в противном случае +1 – mata
А, спасибо! Я не использовал namedtuple через некоторое время, просто подражал формату OP. Я делаю что-то очень похожее в функции 'oneOf' pyparsing. – PaulMcG
Существует также по умолчанию 'repr': вы хотите' Point (x = 1, y = 2) ', а не' P (x = 1, y = 2) '. –
Возможный дубликат [Что такое «названные кортежи» в Python?] (Http://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python) – b4hand