2017-03-11 1 views
0

Disons que j'ai un objet composant, par ex. Route.Constructeur de composant Python wrap avec la méthode et le maintien de l'argument

class Route: 
    def __init__(self, url='localhost', port=80) 
     ... 

Je veux offrir une classe de gestionnaire de routage, semblable à ce que Flask fait avec @app.route, donc je peux créer et garder une trace des routes:

class Router: 
    def route(self, *args, **kwargs): 
     route = Route(*args, **kwargs) 
     self.routes.append(route) 

est-il un moyen facile de faire la Router.route méthode avoir compléter l'argument et/ou la documentation reflétant automatiquement Route.__init__?

J'ai essayé d'utiliser functools.wraps, mais cela n'a eu aucun effet immédiat. Peut-être que je l'ai mal utilisé?

class Router: 
    @wraps(Route.__init__) 
    def route(self, *args, **kwargs): 
     route = Route(*args, **kwargs) 
     self.routes.append(route) 

EDIT: J'utilise Python 3.6 avec la nouvelle PyCharm (02/03/2016).

+0

Dans quel IDE voulez-vous travailler votre achèvement? Quelle version de Python utilisez-vous? Les anciennes API regardent directement l'objet de code. il n'y a aucun moyen de les piéger. Le code le plus récent utilise des protocoles avancés. –

+0

J'espérais une solution universelle, mais j'ai mis à jour la question avec ma configuration. Une solution spécifique est préférable à aucune solution. – VillasV

Répondre

1

Si vous

import inspect 
print(inspect.signature(Route.route)) 
print(help(Route.route)) 

vous verrez que functools.wraps en réalité pour le travail. Cependant, il semble que PyCharm ne soit pas au courant de la signification de functools.wraps. Je suggère de signaler cela comme un bug à JetBrains.

+0

L'avez-vous reproduit? Je veux m'assurer avant de rapporter. – VillasV

+0

Oui, je l'ai fait. PyCharm ne reconnaît pas functools.wraps de cette manière. –

+0

Il existe maintenant un bug PyCharm [PY-23067] (https://youtrack.jetbrains.com/issue/PY-23067#tab=Comments&u=1492615536736) demandant cette fonctionnalité. @VillasV - Si vous voulez la fonctionnalité, votez pour cela. – mtd