W rzeczywistości tytuł nie odzwierciedla dokładnie tego pytania, które chcę zadać. Mój cel jest taki: piszę niektóre funkcje kreślenia za pomocą matplotlib. Mam szereg funkcji przeznaczonych do różnych celów drukowania. jak line_plot() dla linii, bar_plot() na pasek itp na przykład:użyć python decorator, aby automatycznie zastąpić domyślną wartość argumentu funkcji?
import matplotlib.pyplot as plt
def line_plot(axes=None,x=None,y=None):
if axes==None:
fig=plt.figure()
axes=fig.add_subplot(111)
else:
pass
axes.plot(x,y)
def bar_plot(axes=None,x=None,y=None):
if axes==None:
fig=plt.figure()
axes=fig.add_subplot(111)
else:
pass
axes.bar(left=x,height=y)
Jednak problemem jest to, dla każdej funkcji, która jest zdefiniowana, muszę powtórzyć tę część kodu:
if axes==None:
fig=plt.figure()
axes=fig.add_subplot(111)
else:
pass
Czy istnieje sposób, jak przy użyciu dekoratora, który mogę zastosować przed zdefiniowaniem funkcji kreślenia, która automatycznie wykona powtarzającą się część kodu? Dlatego nie muszę ich powtarzać za każdym razem.
jedną z możliwych opcji jest zdefiniować funkcję tak:
def check_axes(axes):
if axes==None:
fig=plt.figure()
axes=fig.add_subplot(111)
return axes
else:
return axes
Następnie przykłady będą jak:
import matplotlib.pyplot as plt
def line_plot(axes=None,x=None,y=None):
axes=check_axes(axes)
axes.plot(x,y)
def bar_plot(axes=None,x=None,y=None):
axes=check_axes(axes)
axes.bar(left=x,height=y)
ale jest lepiej/czyste/bardziej pythonic sposób? Myślę, że mogę użyć dekoratora, ale nie zrozumiałem. czy ktokolwiek mógłby dać jakiś pomysł?
Dzięki!
Myślę, że twoje ostatnie rozwiązanie jest całkiem dobre. Funkcje są efektywnymi, sprawdzonymi sposobami budowania kodu. Podejrzewam, że dekorator komplikowałby niepotrzebnie rzeczy. –
Być może możesz stworzyć klasę osi z testem w swoim init – zenpoy