2017-02-23 1 views
0

J'ai deux fonctions dans une classe, plot() et show(). show(), comme méthode pratique, ne fait rien d'autre que d'ajouter deux lignes au code de plot() commeCopier la signature, transférer tous les arguments de la fonction wrapper

def plot(
     self, 
     show_this=True, 
     show_that=True, 
     color='k', 
     boundary_color=None, 
     other_color=[0.8, 0.8, 0.8], 
     show_axes=True 
     ): 
    # lots of code 
    return 

def show(
     self, 
     show_this=True, 
     show_that=True, 
     color='k', 
     boundary_color=None, 
     other_color=[0.8, 0.8, 0.8], 
     show_axes=True 
     ): 
    from matplotlib import pyplot as plt 
    self.plot(
     show_this=show_this, 
     show_that=show_that, 
     color=color, 
     boundary_color=boundary_color, 
     other_color=other_color, 
     show_axes=show_axes 
     ) 
    plt.show() 
    return 

tout cela fonctionne.

Le problème que j'ai, c'est que cela semble façon trop de code dans l'emballage show(). Ce que je veux vraiment: Soit show() avoir la même signature et les mêmes arguments par défaut que plot(), et lui transmettre tous les arguments.

Des indices?

+0

le 'i Le module nspect' a une classe 'Signature' depuis Python 3.3. –

+0

Python 2 ou Python 3? Ce dernier a plus de possibilités de copier des signatures –

+0

Le code doit être compatible avec Python 2, mais je serais curieux de connaître les possibilités que vous mentionnez. –

Répondre

2

Vous pouvez utiliser l'emballage d'arguments/déballer:

def show(self, *args, **kwargs): 
    from matplotlib import pyplot as plt 
    self.plot(*args, **kwargs) 
    plt.show() 
1

Python 3 offre la possibilité de copier effectivement la signature de la fonction enveloppée avec le module inspecter:

def show(self, *args, **kwargs): 
    from matplotlib import pyplot as plt 
    self.plot(*args, **kwargs) 
    plt.show() 
show.__signature__ = inspect.signature(plot) 

Maintenant, si vous utiliser show dans un shell qui fournit l'auto-complétion comme IDLE, vous verrez les paramètres corrects pour show au lieu des cryptiques *args, **kwargs