MEP13: Use propriedades para Artistas #

Estado #

  • Discussão

Filiais e solicitações pull #

Nenhum

Resumo #

Envolva todos os métodos getter e setter matplotlib com propriedades python , permitindo que sejam lidos e gravados como atributos de classe.

Descrição detalhada #

Atualmente matplotlib usa funções getter e setter (geralmente prefixadas com get_ e set_, respectivamente) para ler e gravar dados relacionados a classes. No entanto, desde a versão 2.6, o python oferece suporte a propriedades, que permitem que essas funções setter e getter sejam acessadas como se fossem atributos. Esta proposta implementaria todos os métodos setter e getter existentes como propriedades.

Implementação #

  1. Todos os métodos getter e setter existentes precisarão ter dois aliases, um com o prefixo get_ ou set_ e outro sem. Os métodos getters que atualmente não possuem prefixos devem ser gravados em um arquivo de texto.

  2. As classes devem ser reorganizadas para que os métodos setter e getter sejam sequenciais no código, com os métodos getter primeiro.

  3. Os métodos getter e setter que fornecem argumentos opcionais opcionais adicionais devem ter esses argumentos acessíveis de outra maneira, como métodos getter ou setter adicionais ou atributos de outras classes. Se essas classes não estiverem acessíveis, devem ser adicionados getters para elas.

  4. Decoradores de propriedade serão adicionados aos métodos setter e getter sem o prefixo. Aqueles com o prefixo serão marcados como obsoletos.

  5. As docstrings precisarão ser reescritas para que o getter com o prefixo tenha a docstring atual e o getter sem o prefixo tenha uma docstring genérica apropriada para um atributo.

  6. A geração automática de alias precisará ser modificada para criar também aliases para as propriedades.

  7. Todas as instâncias de chamadas de método getter e setter precisarão ser alteradas para atribuir acesso.

  8. Todos os aliases setter e getter com prefixos serão removidos

As seguintes etapas podem ser executadas simultaneamente: 1, 2 e 3; 4 e 5; 6 e 7.

Apenas as seguintes etapas devem ser executadas na mesma versão: 4, 5 e 6. Todas as outras alterações podem ser feitas em versões separadas. 8 deve ser feito vários lançamentos importantes depois de tudo.

Compatibilidade com versões anteriores #

Todos os métodos getter existentes que não possuem um prefixo (como get_) precisarão ser alterados de chamadas de função para acesso de atributo. Na maioria dos casos, isso exigirá apenas a remoção dos parênteses.

Os métodos setter e getter que possuem argumentos opcionais adicionais precisarão ter esses argumentos implementados de outra maneira, como uma propriedade separada na mesma classe ou como atributos ou propriedades de outra classe.

Os casos em que o setter retorna um valor precisarão ser alterados para usar o setter seguido pelo getter.

Casos onde existam métodos set_ATTR_on() e set_ATTR_off() serão alterados para propriedades ATTR_on.

Exemplos #

axes.Axes.set_axis_off/set_axis_on #

Implementação atual:

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

Nova implementação:

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 e get_autoscalex_on/set_autoscalex_on #

Implementação atual:

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

Nova implementação:

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

Implementação atual:

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

Nova implementação:

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 #

Implementação atual:

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

Nova implementação:

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

Em vez de usar decoradores, também é possível usar a função de propriedade. Isso mudaria o procedimento para que todos os métodos getter sem prefixo precisassem ser renomeados ou removidos. Isso torna o manuseio de docstrings mais difícil e mais difícil de ler.

Não é necessário desaprovar os métodos setter e getter, mas deixá-los em uso complicará o código.

Isso também pode servir como uma oportunidade para reescrever ou até mesmo remover a geração automática de alias.

Outra proposta alternativa:

Converta set_xlim, set_xlabel, set_title, etc. para xlim, xlabel, title,... para tornar a transição de plt funções para axesmétodos significativamente mais simples. Esses ainda seriam métodos, não propriedades, mas ainda é um grande aprimoramento de usabilidade, mantendo a interface.