MEP13: Eigenschaften für Künstler verwenden #

Status #

  • Diskussion

Branches und Pull-Requests #

Keiner

Zusammenfassung #

Umschließen Sie alle Matplotlib-Getter- und -Setter-Methoden mit Python- Eigenschaften , sodass sie wie Klassenattribute gelesen und geschrieben werden können.

Detaillierte Beschreibung #

Derzeit verwendet Matplotlib Getter- und Setter-Funktionen (normalerweise mit dem Präfix get_ bzw. set_) zum Lesen und Schreiben von Daten, die sich auf Klassen beziehen. Seit 2.6 unterstützt Python jedoch Eigenschaften, die es ermöglichen, auf solche Setter- und Getter-Funktionen zuzugreifen, als wären sie Attribute. Dieser Vorschlag würde alle existierenden Setter- und Getter-Methoden als Eigenschaften implementieren.

Implementierung #

  1. Alle vorhandenen Getter- und Setter-Methoden müssen zwei Aliase haben, einen mit dem Präfix get_ oder set_ und einen ohne. Getter-Methoden, denen derzeit Präfixe fehlen, sollten in einer Textdatei aufgezeichnet werden.

  2. Klassen sollten neu organisiert werden, damit Setter- und Getter-Methoden im Code sequentiell sind, wobei Getter-Methoden zuerst verwendet werden.

  3. Getter- und Setter-Methoden, die zusätzliche optionale optionale Argumente bereitstellen, sollten diese Argumente auf andere Weise zugänglich machen, entweder als zusätzliche Getter- oder Setter-Methoden oder als Attribute anderer Klassen. Wenn auf diese Klassen nicht zugegriffen werden kann, sollten Getter für sie hinzugefügt werden.

  4. Eigenschaftsdekoratoren werden den Setter- und Getter-Methoden ohne das Präfix hinzugefügt. Diejenigen mit dem Präfix werden als veraltet markiert.

  5. Docstrings müssen umgeschrieben werden, sodass der Getter mit dem Präfix den aktuellen Docstring hat und der Getter ohne das Präfix einen generischen Docstring hat, der für ein Attribut geeignet ist.

  6. Die automatische Aliasgenerierung muss geändert werden, damit auch Aliase für die Eigenschaften erstellt werden.

  7. Alle Instanzen von Getter- und Setter-Methodenaufrufen müssen in Attributzugriff geändert werden.

  8. Alle Setter- und Getter-Aliase mit Präfixen werden entfernt

Die folgenden Schritte können gleichzeitig durchgeführt werden: 1, 2 und 3; 4 und 5; 6 und 7.

Nur die folgenden Schritte müssen in derselben Version durchgeführt werden: 4, 5 und 6. Alle anderen Änderungen können in separaten Versionen vorgenommen werden. 8 sollten nach allem anderen mehrere Major-Releases erfolgen.

Abwärtskompatibilität #

Alle vorhandenen Getter-Methoden, die kein Präfix haben (z. B. get_), müssen von Funktionsaufrufen auf Attributzugriff geändert werden. In den meisten Fällen muss dazu nur die Klammer entfernt werden.

Bei Setter- und Getter-Methoden mit zusätzlichen optionalen Argumenten müssen diese Argumente auf andere Weise implementiert werden, entweder als separate Eigenschaft in derselben Klasse oder als Attribute oder Eigenschaften einer anderen Klasse.

Fälle, in denen der Setter einen Wert zurückgibt, müssen geändert werden, um den Setter gefolgt vom Getter zu verwenden.

Fälle, in denen die Methoden set_ATTR_on() und set_ATTR_off() vorhanden sind, werden in ATTR_on-Eigenschaften geändert.

Beispiele #

Achsen.Achsen.set_axis_off/set_axis_on #

Aktuelle Umsetzung:

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

Neue Implementierung:

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

axis.Axes.get_xlim/set_xlim und get_autoscalex_on/set_autoscalex_on #

Aktuelle Umsetzung:

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

Neue Implementierung:

[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

Achsen.Achsen.get_title/set_title #

Aktuelle Umsetzung:

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

Neue Implementierung:

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

axis.Axes.get_xticklabels/set_xticklabels #

Aktuelle Umsetzung:

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

Neue Implementierung:

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

Alternativen #

Anstatt Decorators zu verwenden, ist es auch möglich, die Eigenschaftsfunktion zu verwenden. Dies würde das Verfahren dahingehend ändern, dass alle Getter-Methoden, denen ein Präfix fehlt, umbenannt oder entfernt werden müssen. Dies macht den Umgang mit Docstrings schwieriger und schwerer lesbar.

Es ist nicht notwendig, die Setter- und Getter-Methoden zu verwerfen, aber das Belassen wird den Code verkomplizieren.

Dies könnte auch als Gelegenheit dienen, die automatische Alias-Generierung umzuschreiben oder sogar zu entfernen.

Noch ein alternativer Vorschlag:

Wandeln Sie set_xlim, set_xlabel, set_title, usw. in xlim, xlabel, title,... um, um den Übergang von plt Funktionen zu axesMethoden erheblich zu vereinfachen. Dies wären immer noch Methoden, keine Eigenschaften, aber es ist immer noch eine großartige Verbesserung der Benutzerfreundlichkeit, während die Schnittstelle beibehalten wird.