MEP13: Usa le proprietà per gli artisti #

Stato n.

  • Discussione

Filiali e Pull request #

Nessuno

Estratto n.

Avvolgi tutti i metodi getter e setter di matplotlib con le proprietà python , consentendo loro di essere letti e scritti come attributi di classe.

Descrizione dettagliata #

Attualmente matplotlib utilizza le funzioni getter e setter (di solito precedute rispettivamente da get_ e set_) per leggere e scrivere dati relativi alle classi. Tuttavia, poiché 2.6 Python supporta le proprietà, che consentono l'accesso a tali funzioni setter e getter come se fossero attributi. Questa proposta implementerebbe tutti i metodi setter e getter esistenti come proprietà.

Implementazione n.

  1. Tutti i metodi getter e setter esistenti dovranno avere due alias, uno con il prefisso get_ o set_ e uno senza. I metodi Getter che attualmente non dispongono di prefissi dovrebbero essere registrati in un file di testo.

  2. Le classi dovrebbero essere riorganizzate in modo che i metodi setter e getter siano sequenziali nel codice, con i metodi getter per primi.

  3. I metodi getter e setter che forniscono argomenti facoltativi aggiuntivi dovrebbero avere tali argomenti accessibili in un altro modo, come metodi getter o setter aggiuntivi o attributi di altre classi. Se quelle classi non sono accessibili, dovrebbero essere aggiunti getter per loro.

  4. I decoratori di proprietà verranno aggiunti ai metodi setter e getter senza il prefisso. Quelli con il prefisso saranno contrassegnati come deprecati.

  5. Le docstring dovranno essere riscritte in modo che il getter con il prefisso abbia la docstring corrente e il getter senza il prefisso abbia una docstring generica appropriata per un attributo.

  6. La generazione automatica degli alias dovrà essere modificata in modo che crei anche alias per le proprietà.

  7. Tutte le istanze di chiamate ai metodi getter e setter dovranno essere modificate per attribuire l'accesso.

  8. Tutti gli alias setter e getter con prefissi verranno rimossi

I seguenti passaggi possono essere eseguiti contemporaneamente: 1, 2 e 3; 4 e 5; 6 e 7.

Nella stessa versione devono essere eseguiti solo i passaggi seguenti: 4, 5 e 6. Tutte le altre modifiche possono essere apportate in versioni separate. 8 dovrebbe essere fatto diverse versioni principali dopo tutto il resto.

Compatibilità con le versioni precedenti #

Tutti i metodi getter esistenti che non hanno un prefisso (come get_) dovranno essere modificati dalle chiamate di funzione all'accesso agli attributi. Nella maggior parte dei casi ciò richiederà solo la rimozione della parentesi.

I metodi setter e getter che hanno argomenti facoltativi aggiuntivi dovranno implementare tali argomenti in un altro modo, come proprietà separate nella stessa classe o come attributi o proprietà di un'altra classe.

I casi in cui il setter restituisce un valore dovranno essere modificati utilizzando il setter seguito dal getter.

I casi in cui sono presenti i metodi set_ATTR_on() e set_ATTR_off() verranno modificati nelle proprietà ATTR_on.

Esempi #

assi.Assi.imposta_asse_off/imposta_asse_on #

Implementazione attuale:

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

Nuova implementazione:

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

assi.Assi.get_xlim/set_xlim e get_autoscalex_on/set_autoscalex_on #

Implementazione attuale:

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

Nuova implementazione:

[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

assi.Assi.get_title/set_title #

Implementazione attuale:

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

Nuova implementazione:

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

assi.Assi.get_xticklabels/set_xticklabels #

Implementazione attuale:

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

Nuova implementazione:

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

Alternative #

Invece di utilizzare i decoratori, è anche possibile utilizzare la funzione di proprietà. Ciò modificherebbe la procedura in modo che tutti i metodi getter privi di prefisso debbano essere rinominati o rimossi. Ciò rende la gestione delle docstring più difficile e più difficile da leggere.

Non è necessario deprecare i metodi setter e getter, ma lasciarli dentro complicherà il codice.

Ciò potrebbe anche servire come opportunità per riscrivere o addirittura rimuovere la generazione automatica di alias.

Altra proposta alternativa:

Converti set_xlim, set_xlabel, set_title, ecc. in xlim, xlabel, title,... per semplificare notevolmente la transizione dalle plt funzioni ai axesmetodi. Questi sarebbero ancora metodi, non proprietà, ma è comunque un grande miglioramento dell'usabilità pur mantenendo l'interfaccia.