MEP13: アーティストのプロパティを使用する#
ステータス番号
討論
ブランチとプルリクエスト#
なし
アブストラクト#
すべての matplotlib getter および setter メソッドを python propertiesでラップし、クラス属性のように読み書きできるようにします。
詳細な説明#
現在、matplotlib は、クラスに関連するデータの読み取りと書き込みにゲッター関数とセッター関数 (通常はそれぞれ get_ と set_ で始まる) を使用しています。ただし、2.6 python ではプロパティがサポートされているため、そのようなセッター関数とゲッター関数に属性であるかのようにアクセスできます。この提案では、既存のすべてのセッター メソッドとゲッター メソッドをプロパティとして実装します。
実装#
すべての既存の getter および setter メソッドには、2 つのエイリアスが必要です。1 つは get_ または set_ プレフィックスを付け、もう 1 つは付けません。現在プレフィックスがないゲッター メソッドは、テキスト ファイルに記録する必要があります。
コード内でセッター メソッドとゲッター メソッドが連続し、ゲッター メソッドが最初になるように、クラスを再編成する必要があります。
追加のオプションのオプション引数を提供するゲッター メソッドとセッター メソッドは、追加のゲッター メソッドまたはセッター メソッド、または他のクラスの属性として、別の方法でそれらの引数にアクセスできるようにする必要があります。これらのクラスにアクセスできない場合は、それらのゲッターを追加する必要があります。
プロパティ デコレータは、接頭辞なしでセッター メソッドとゲッター メソッドに追加されます。接頭辞が付いているものは非推奨としてマークされます。
docstring を書き直す必要があるため、接頭辞付きの getter は現在の docstring を持ち、接頭辞なしの getter は属性に適した一般的な docstring を持ちます。
プロパティのエイリアスも作成されるように、自動エイリアス生成を変更する必要があります。
getter および setter メソッド呼び出しのすべてのインスタンスは、属性アクセスに変更する必要があります。
プレフィックスを持つすべてのセッターおよびゲッター エイリアスが削除されます
次の手順を同時に実行できます。1、2、および 3。4と5; 6と7。
次の手順のみを同じリリースで実行する必要があります: 4、5、および 6。他のすべての変更は、個別のリリースで実行できます。8 は、他のすべての後にいくつかのメジャー リリースを行う必要があります。
下位互換性#
プレフィックス (get_ など) を持たないすべての既存の getter メソッドは、関数呼び出しから属性アクセスに変更する必要があります。ほとんどの場合、括弧を削除するだけで済みます。
追加のオプション引数を持つセッター メソッドとゲッター メソッドは、同じクラスの個別のプロパティとして、または別のクラスの属性またはプロパティとして、別の方法でそれらの引数を実装する必要があります。
セッターが値を返す場合は、セッターの後にゲッターを使用するように変更する必要があります。
set_ATTR_on() および set_ATTR_off() メソッドがある場合は、ATTR_on プロパティに変更されます。
例#
axis.Axes.set_axis_off/set_axis_on #
現在の実装:
axes.Axes.set_axis_off()
axes.Axes.set_axis_on()
新しい実装:
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 および get_autoscalex_on/set_autoscalex_on #
現在の実装:
[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)
新しい実装:
[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
軸.軸.get_title/set_title #
現在の実装:
string = axes.Axes.get_title()
axes.Axes.set_title(string, fontdict=fontdict, **kwargs)
新しい実装:
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
軸.軸.get_xticklabels/set_xticklabels #
現在の実装:
[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)
新しい実装:
[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]
代替案#
デコレーターを使用する代わりに、プロパティ関数を使用することもできます。これにより手順が変更され、プレフィックスがないすべての getter メソッドの名前を変更するか、削除する必要があります。これにより、docstring の処理がより難しくなり、読みにくくなります。
setter メソッドと getter メソッドを非推奨にする必要はありませんが、そのままにしておくとコードが複雑になります。
これは、エイリアスの自動生成を書き直したり削除したりする機会にもなります。
別の代替提案:
set_xlim
、set_xlabel
、set_title
などをxlim
、
xlabel
、title
、... に変換して、plt
関数からaxes
メソッドへの移行を大幅に簡素化します。これらは引き続きプロパティではなくメソッドになりますが、インターフェイスを維持しながら、使いやすさを大幅に向上させることができます。