MEP13: Usar propiedades para Artistas #
Estado #
Discusión
Sucursales y solicitudes de extracción #
Ninguna
Resumen #
Envuelva todos los métodos getter y setter de matplotlib con propiedades de python , lo que les permite leerse y escribirse como atributos de clase.
Descripción detallada #
Actualmente, matplotlib usa funciones getter y setter (generalmente con el prefijo get_ y set_, respectivamente) para leer y escribir datos relacionados con las clases. Sin embargo, desde 2.6 python admite propiedades, lo que permite acceder a funciones de setter y getter como si fueran atributos. Esta propuesta implementaría todos los métodos setter y getter existentes como propiedades.
Implementación #
Todos los métodos getter y setter existentes deberán tener dos alias, uno con el prefijo get_ o set_ y otro sin él. Los métodos getter que actualmente carecen de prefijos deben registrarse en un archivo de texto.
Las clases deben reorganizarse para que los métodos setter y getter sean secuenciales en el código, con los métodos getter primero.
Los métodos getter y setter que proporcionan argumentos opcionales adicionales deben tener esos argumentos accesibles de otra manera, ya sea como métodos getter o setter adicionales o atributos de otras clases. Si esas clases no son accesibles, se deben agregar captadores para ellas.
Los decoradores de propiedades se agregarán a los métodos setter y getter sin el prefijo. Los que tengan el prefijo se marcarán como obsoletos.
Será necesario reescribir las cadenas de documentación para que el captador con el prefijo tenga la cadena de documentación actual y el captador sin el prefijo tenga una cadena de documentación genérica apropiada para un atributo.
Será necesario modificar la generación automática de alias para que también cree alias para las propiedades.
Todas las instancias de llamadas a métodos getter y setter deberán cambiarse para acceder a atributos.
Se eliminarán todos los alias de setter y getter con prefijos.
Los siguientes pasos se pueden realizar simultáneamente: 1, 2 y 3; 4 y 5; 6 y 7.
Solo los siguientes pasos se deben realizar en la misma versión: 4, 5 y 6. Todos los demás cambios se pueden realizar en versiones independientes. 8 debe hacerse varios lanzamientos importantes después de todo lo demás.
Compatibilidad con versiones anteriores #
Todos los métodos getter existentes que no tienen un prefijo (como get_) deberán cambiarse de llamadas de función a acceso de atributos. En la mayoría de los casos, esto solo requerirá eliminar el paréntesis.
Los métodos setter y getter que tienen argumentos opcionales adicionales necesitarán implementar esos argumentos de otra manera, ya sea como una propiedad separada en la misma clase o como atributos o propiedades de otra clase.
Los casos en los que el setter devuelve un valor deberán cambiarse para usar el setter seguido del getter.
Los casos en los que haya métodos set_ATTR_on() y set_ATTR_off() se cambiarán a las propiedades ATTR_on.
Ejemplos #
ejes.Ejes.set_axis_off/set_axis_on #
Implementación actual:
axes.Axes.set_axis_off()
axes.Axes.set_axis_on()
Nueva implementación:
True = axes.Axes.axis_on
False = axes.Axes.axis_on
axes.Axes.axis_on = True
axes.Axes.axis_on = False
ejes.Ejes.get_xlim/set_xlim y get_autoscalex_on/set_autoscalex_on #
Implementación actual:
[left, right] = axes.Axes.get_xlim()
auto = axes.Axes.get_autoscalex_on()
[left, right] = axes.Axes.set_xlim(left=left, right=right, emit=emit, auto=auto)
[left, right] = axes.Axes.set_xlim(left=left, right=None, emit=emit, auto=auto)
[left, right] = axes.Axes.set_xlim(left=None, right=right, emit=emit, auto=auto)
[left, right] = axes.Axes.set_xlim(left=left, emit=emit, auto=auto)
[left, right] = axes.Axes.set_xlim(right=right, emit=emit, auto=auto)
axes.Axes.set_autoscalex_on(auto)
Nueva implementación:
[left, right] = axes.Axes.axes_xlim
auto = axes.Axes.autoscalex_on
axes.Axes.axes_xlim = [left, right]
axes.Axes.axes_xlim = [left, None]
axes.Axes.axes_xlim = [None, right]
axes.Axes.axes_xlim[0] = left
axes.Axes.axes_xlim[1] = right
axes.Axes.autoscalex_on = auto
axes.Axes.emit_xlim = emit
ejes.Ejes.get_title/set_title #
Implementación actual:
string = axes.Axes.get_title()
axes.Axes.set_title(string, fontdict=fontdict, **kwargs)
Nueva implementación:
string = axes.Axes.title
string = axes.Axes.title_text.text
text.Text = axes.Axes.title_text
text.Text.<attribute> = attribute
text.Text.fontdict = fontdict
axes.Axes.title = string
axes.Axes.title = text.Text
axes.Axes.title_text = string
axes.Axes.title_text = text.Text
ejes.Ejes.get_xticklabels/set_xticklabels #
Implementación actual:
[text.Text] = axes.Axes.get_xticklabels()
[text.Text] = axes.Axes.get_xticklabels(minor=False)
[text.Text] = axes.Axes.get_xticklabels(minor=True)
[text.Text] = axes.Axes.([string], fontdict=None, **kwargs)
[text.Text] = axes.Axes.([string], fontdict=None, minor=False, **kwargs)
[text.Text] = axes.Axes.([string], fontdict=None, minor=True, **kwargs)
Nueva implementación:
[text.Text] = axes.Axes.xticklabels
[text.Text] = axes.Axes.xminorticklabels
axes.Axes.xticklabels = [string]
axes.Axes.xminorticklabels = [string]
axes.Axes.xticklabels = [text.Text]
axes.Axes.xminorticklabels = [text.Text]
Alternativas #
En lugar de usar decoradores, también es posible usar la función de propiedad. Esto cambiaría el procedimiento para que todos los métodos captadores que carezcan de un prefijo deban ser renombrados o eliminados. Esto hace que el manejo de cadenas de documentos sea más difícil y más difícil de leer.
No es necesario desaprobar los métodos setter y getter, pero dejarlos complicará el código.
Esto también podría servir como una oportunidad para reescribir o incluso eliminar la generación automática de alias.
Otra propuesta alternativa:
Convierta set_xlim
, set_xlabel
, set_title
, etc. a xlim
,
xlabel
, title
,... para simplificar significativamente la transición de plt
funciones a axes
métodos. Estos seguirían siendo métodos, no propiedades, pero sigue siendo una gran mejora de usabilidad al tiempo que conserva la interfaz.