MEP13: 아티스트용 속성 사용 #
상태 번호
논의
브랜치 및 풀 리퀘스트 #
없음
초록 #
모든 matplotlib getter 및 setter 메서드를 python 속성 으로 래핑 하여 클래스 특성처럼 읽고 쓸 수 있도록 합니다.
자세한 설명 #
현재 matplotlib는 클래스와 관련된 데이터를 읽고 쓰기 위해 getter 및 setter 함수(일반적으로 각각 get_ 및 set_ 접두사가 붙음)를 사용합니다. 그러나 파이썬 2.6부터 속성을 지원하므로 속성인 것처럼 세터 및 게터 함수에 액세스할 수 있습니다. 이 제안은 기존의 모든 setter 및 getter 메서드를 속성으로 구현합니다.
구현 #
기존의 모든 getter 및 setter 메서드에는 get_ 또는 set_ 접두사가 있는 별칭과 없는 두 개의 별칭이 필요합니다. 현재 접두사가 없는 Getter 메서드는 텍스트 파일에 기록해야 합니다.
코드에서 setter 및 getter 메서드가 순차적이고 getter 메서드가 먼저 나오도록 클래스를 재구성해야 합니다.
추가 선택적 선택적 인수를 제공하는 Getter 및 Setter 메서드는 추가 getter 또는 setter 메서드나 다른 클래스의 특성으로 다른 방식으로 이러한 인수에 액세스할 수 있어야 합니다. 해당 클래스에 액세스할 수 없는 경우 해당 클래스에 대한 getter를 추가해야 합니다.
속성 데코레이터는 접두사 없이 setter 및 getter 메서드에 추가됩니다. 접두사가 있는 항목은 더 이상 사용되지 않는 것으로 표시됩니다.
접두사가 있는 getter가 현재 독스트링을 갖고 접두사가 없는 getter가 속성에 적합한 일반 독스트링을 갖도록 독스트링을 다시 작성해야 합니다.
속성에 대한 별칭도 생성하도록 자동 별칭 생성을 수정해야 합니다.
getter 및 setter 메서드 호출의 모든 인스턴스를 속성 액세스로 변경해야 합니다.
접두사가 있는 모든 setter 및 getter 별칭이 제거됩니다.
다음 단계를 동시에 수행할 수 있습니다. 1, 2 및 3; 4 및 5; 6과 7.
동일한 릴리스에서 다음 단계만 수행해야 합니다. 4, 5 및 6. 다른 모든 변경 사항은 별도의 릴리스에서 수행할 수 있습니다. 8은 다른 모든 작업 후에 몇 가지 주요 릴리스를 수행해야 합니다.
이전 버전과의 호환성 #
접두사가 없는 모든 기존 getter 메서드(예: get_)는 함수 호출에서 특성 액세스로 변경해야 합니다. 대부분의 경우 괄호만 제거하면 됩니다.
추가 선택적 인수가 있는 setter 및 getter 메서드는 이러한 인수를 동일한 클래스의 별도 속성 또는 다른 클래스의 특성 또는 속성으로 다른 방식으로 구현해야 합니다.
setter가 값을 반환하는 경우 setter 다음에 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
axis.Axes.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
axes.Axes.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 메서드의 이름을 바꾸거나 제거해야 하도록 절차가 변경됩니다. 이로 인해 독스트링 처리가 더 어렵고 읽기 어려워집니다.
setter 및 getter 메서드를 폐기할 필요는 없지만 그대로 두면 코드가 복잡해집니다.
이는 또한 자동 별칭 생성을 다시 작성하거나 제거할 수 있는 기회가 될 수도 있습니다.
다른 대체 제안:
set_xlim
, , 등을 ,
set_xlabel
, , ...로 변환하여 함수
에서 메서드로 훨씬 간단하게 전환합니다. 이들은 여전히 속성이 아닌 메서드이지만 인터페이스를 유지하면서 여전히 유용성이 크게 향상되었습니다.set_title
xlim
xlabel
title
plt
axes