En realidad, el título no refleja exactamente la pregunta que quiero formular. Mi propósito es el siguiente: estoy escribiendo algunas funciones de trazado usando matplotlib. Tengo una serie de funciones que son para diferentes propósitos de trazado. como line_plot() para las líneas, bar_plot() para la barra etc., por ejemplo:use el decorador de python para reemplazar automáticamente el valor predeterminado del argumento de función?
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)
Sin embargo, el problema es, para cada función que se define, tengo que repetir esta parte del código:
if axes==None:
fig=plt.figure()
axes=fig.add_subplot(111)
else:
pass
¿Hay alguna manera de utilizar un decorador, que puedo aplicar antes de la definición de la función de trazado, que hará la parte repetida del código automáticamente? Por lo tanto, no tengo que repetirlos cada vez.
una opción posible es definir una función como esta:
def check_axes(axes):
if axes==None:
fig=plt.figure()
axes=fig.add_subplot(111)
return axes
else:
return axes
A continuación, los ejemplos serán como:
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)
Pero ¿Hay una mejor manera/limpia/más Pythonic? Supongo que puedo usar un decorador pero no me di cuenta. ¿Alguien podría dar una idea?
Gracias!
Creo que su última solución es bastante buena. Las funciones son formas eficaces y comprobadas de estructurar el código. Sospecho que un decorador podría complicar las cosas innecesariamente. –
Tal vez puedas crear una clase de ejes con tu prueba en su init – zenpoy