¿Cuál es el uso de typename asociado a una clase en particular? Por ejemplo,Uso de nombres de tipos de clase en python
Point = namedtuple('P', ['x', 'y'])
Dónde habría que suela usar nombre de tipo 'P'?
¡Gracias!
¿Cuál es el uso de typename asociado a una clase en particular? Por ejemplo,Uso de nombres de tipos de clase en python
Point = namedtuple('P', ['x', 'y'])
Dónde habría que suela usar nombre de tipo 'P'?
¡Gracias!
Sólo por el bien de la cordura, el primer argumento de namedtuple debe ser el mismo que el nombre de la variable se asigna a:
>>> from collections import namedtuple
>>> Point = namedtuple('P','x y')
>>> pp = Point(1,2)
>>> type(pp)
<class '__main__.P'>
isinstance no está demasiado preocupado por esto, aunque sólo lo que es 'P' no se sabe:
>>> isinstance(pp,Point)
True
>>> isinstance(pp,P)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'P' is not defined
Pero salmuera es un módulo que se preocupa por encontrar el nombre de la clase que coincide con el nombre de tipo:
>>> 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
Si defino la namedtuple como 'Punto', a continuación, salmuera es feliz:
>>> Point = namedtuple('Point','x y')
>>> pp = Point(1,2)
>>> ppp = pickle.dumps(pp)
>>>
Desafortunadamente, es a usted para manejar esta consistencia. No hay forma de que namedtuple sepa a qué asigna su salida, ya que la asignación es una declaración y no un operador en Python, por lo que debe pasar el nombre de clase correcto a namedtuple y asignar la clase resultante a una variable del mismo nombre.
no necesita ' .split() 'en los nombres de campo, eso es [hecho automáticamente] (http://docs.python.org/library/collections#collections.namedtuple) si especifica los nombres como una cadena. de lo contrario, +1 – mata
¡Ah, gracias! No he utilizado namedtuple en un tiempo, solo estaba imitando el formato del OP. Hago algo muy similar en la función 'oneOf' de pyparsing. – PaulMcG
También está el 'repr' predeterminado: quiere' Punto (x = 1, y = 2) ', no' P (x = 1, y = 2) '. –
posible duplicado de [¿Qué son las "tuplas con nombre" en Python?] (Http://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python) – b4hand