MEP13 : Utiliser les propriétés pour les artistes #

Statut #

  • Discussion

Branches et demandes d'extraction #

Aucun

Résumé #

Enveloppez toutes les méthodes getter et setter matplotlib avec des propriétés python , leur permettant d'être lues et écrites comme des attributs de classe.

Descriptif détaillé #

Actuellement, matplotlib utilise des fonctions getter et setter (généralement préfixées par get_ et set_, respectivement) pour lire et écrire des données liées aux classes. Cependant, depuis la version 2.6, python prend en charge les propriétés, qui permettent d'accéder à ces fonctions setter et getter comme s'il s'agissait d'attributs. Cette proposition implémenterait toutes les méthodes setter et getter existantes en tant que propriétés.

Mise en œuvre #

  1. Toutes les méthodes getter et setter existantes devront avoir deux alias, un avec le préfixe get_ ou set_ et un sans. Les méthodes getter qui manquent actuellement de préfixes doivent être enregistrées dans un fichier texte.

  2. Les classes doivent être réorganisées afin que les méthodes setter et getter soient séquentielles dans le code, avec les méthodes getter en premier.

  3. Les méthodes getter et setter qui fournissent des arguments facultatifs supplémentaires doivent avoir ces arguments accessibles d'une autre manière, soit en tant que méthodes getter ou setter supplémentaires, soit en tant qu'attributs d'autres classes. Si ces classes ne sont pas accessibles, des getters pour elles doivent être ajoutés.

  4. Les décorateurs de propriété seront ajoutés aux méthodes setter et getter sans le préfixe. Ceux avec le préfixe seront marqués comme obsolètes.

  5. Les docstrings devront être réécrits afin que le getter avec le préfixe ait la docstring actuelle et que le getter sans le préfixe ait une docstring générique appropriée pour un attribut.

  6. La génération automatique d'alias devra être modifiée afin de créer également des alias pour les propriétés.

  7. Toutes les instances d'appels de méthode getter et setter devront être modifiées en accès aux attributs.

  8. Tous les alias setter et getter avec préfixes seront supprimés

Les étapes suivantes peuvent être effectuées simultanément : 1, 2 et 3 ; 4 et 5 ; 6 et 7.

Seules les étapes suivantes doivent être effectuées dans la même version : 4, 5 et 6. Toutes les autres modifications peuvent être effectuées dans des versions distinctes. 8 devrait être fait plusieurs versions majeures après tout le reste.

Rétrocompatibilité #

Toutes les méthodes getter existantes qui n'ont pas de préfixe (telles que get_) devront être modifiées des appels de fonction à l'accès aux attributs. Dans la plupart des cas, cela ne nécessitera que la suppression de la parenthèse.

Les méthodes setter et getter qui ont des arguments facultatifs supplémentaires devront avoir ces arguments implémentés d'une autre manière, soit en tant que propriété distincte dans la même classe, soit en tant qu'attributs ou propriétés d'une autre classe.

Les cas où le setter renvoie une valeur devront être modifiés en utilisant le setter suivi du getter.

Les cas où il y a des méthodes set_ATTR_on() et set_ATTR_off() seront changés en propriétés ATTR_on.

Exemples #

axes.Axes.set_axis_off/set_axis_on #

Implémentation actuelle :

axes.Axes.set_axis_off()
axes.Axes.set_axis_on()

Nouvelle implémentation :

True = axes.Axes.axis_on
False = axes.Axes.axis_on
axes.Axes.axis_on = True
axes.Axes.axis_on = False

axes.Axes.get_xlim/set_xlim et get_autoscalex_on/set_autoscalex_on #

Implémentation actuelle :

[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)

Nouvelle implémentation :

[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

axes.Axes.get_title/set_title #

Implémentation actuelle :

string = axes.Axes.get_title()
axes.Axes.set_title(string, fontdict=fontdict, **kwargs)

Nouvelle implémentation :

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

axes.Axes.get_xticklabels/set_xticklabels #

Implémentation actuelle :

[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)

Nouvelle implémentation :

[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]

Alternatives #

Au lieu d'utiliser des décorateurs, il est également possible d'utiliser la fonction de propriété. Cela modifierait la procédure de sorte que toutes les méthodes getter dépourvues de préfixe devront être renommées ou supprimées. Cela rend la manipulation des docstrings plus difficile et plus difficile à lire.

Il n'est pas nécessaire de déprécier les méthodes setter et getter, mais les laisser compliquera le code.

Cela pourrait également être l'occasion de réécrire ou même de supprimer la génération automatique d'alias.

Autre proposition alternative :

Convertissez set_xlim, set_xlabel, set_title, etc. en xlim, xlabel, title,... pour simplifier considérablement la transition des plt fonctions aux axesméthodes. Ce seraient toujours des méthodes, pas des propriétés, mais c'est toujours une grande amélioration de la convivialité tout en conservant l'interface.