Pregunta

Sólo encontró un problema en el dict "tipo" de subclases. Hice método de reemplazo __iter__ y esperaba que afectará a otros métodos como iterkeys, llaves, etc. porque creía que llamar __iter__ método para obtener los valores pero parece que se implementan de forma independiente y tengo que reemplazar todos ellos.

Es esto un error o una intención que no hacen uso de otros métodos y valores Recupera separado?

No se encontró en la descripción de la documentación estándar de Python de las llamadas de dependencia entre los métodos de las clases estándar. Sería muy útil para sublassing trabajo y para la orientación de qué métodos se requiere para anular para el comportamiento adecuado. ¿Hay alguna documentación complementaria sobre la base de pitón tipos / clases de elementos internos?

¿Fue útil?

Solución

Mapping Subclase o MuteableMapping de la colecciones módulo en lugar de dict y obtener todos estos métodos de forma gratuita.

Aquí hay un ejemplo de una asignación mínima y algunos de los métodos que se obtiene de forma gratuita:

import collections
class MinimalMapping(collections.Mapping):
    def __init__(self, *items ):
        self.elements = dict(items)
    def __getitem__(self, key):
        return self.elements[key]
    def __len__(self):
        return len(self.elements)
    def __iter__(self):
        return iter(self.elements)

t = MinimalMapping()
print (t.iteritems, t.keys, t.itervalues, t.get)

Para cualquier subclase de los contenedores empotrados siempre debe utilizar las baseclass apropiados desde el módulo de colecciones.

Otros consejos

Si no se especifica en la documentación, es específica aplicación . Implementaciones otra que CPython podría volver a usar el método para implementar iter iterkeys y otros. Yo no considero que esto es un error, sino simplemente un poco de libertad para los implementadores.

Sospecho que hay un factor de rendimiento en la aplicación de los métodos de forma independiente, especialmente en lo que los diccionarios son tan ampliamente utilizados en Python.

Así que, básicamente, debe ponerlas en práctica.

Ya sabes el dicho: "Usted sabe lo que pasa cuando usted asume". :-)

Ellos no documentar oficialmente esas cosas, ya que pueden decidir cambiar en el futuro. Cualquier documentación oficial se puede encontrar simplemente documentar el comportamiento actual de una implementación de Python, y confiando en que se traduciría en su código que es muy, muy frágil.

Cuando hay documentación oficial de métodos especiales, tiende a describir el comportamiento del intérprete con respecto a sus propias clases, como el uso __len__() cuando no se implementa __nonzero__(), o que sólo necesitan __lt()__ para la clasificación.

Como Python utiliza tipos de pato, por lo general no necesita realmente a heredar de una clase incorporada para hacer su propio acto de clase como tal. Por lo que podría reconsiderar si la subclasificación dict es realmente lo que quiere hacer. Es posible elegir una clase diferente, como algo del módulo collections, o encapsular en lugar de heredar. (La clase UserString utiliza la encapsulación.) O simplemente empezar de cero.

En lugar de la subclasificación dict, en su lugar podría simplemente crear su propia clase que tiene exactamente las propiedades que desee sin demasiados problemas. Aquí hay una un blog post con un ejemplo de cómo hacer esto. El método __str__() en ella no es la mejor, pero eso se puede corregir fácilmente el resto proporcionan la funcionalidad que usted busca.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top