2011-05-09 2 views
8

Je participe à la maintenance d'un package pour python appelé nxt-python. Il utilise des métaclasses pour définir les méthodes d'un objet de contrôle. Voici la méthode qui définit les fonctions disponibles:Définition explicite de la docstring d'une méthode

class _Meta(type): 
    'Metaclass which adds one method for each telegram opcode' 

    def __init__(cls, name, bases, dict): 
     super(_Meta, cls).__init__(name, bases, dict) 
     for opcode in OPCODES: 
      poll_func, parse_func = OPCODES[opcode] 
      m = _make_poller(opcode, poll_func, parse_func) 
      setattr(cls, poll_func.__name__, m) 

Je veux être en mesure d'ajouter un autre docstring à chacune de ces méthodes qu'il ajoute. m est une méthode renvoyée par _make_poller(). Des idées? Existe-t-il un moyen de contourner la restriction python lors du changement de docstrings?

+0

Vous pouvez également passer dans votre 'constructeur _Meta' dans le' dict' argument '_Meta (ferm, nom, bases, dict = { '__ doc __': "" "docstring" ""})' ou appelez 'dict.update ({'__ doc __':" "" docstring "" "})' avant votre appel 'super'. Maintenant vous avez au moins 4 options. –

Répondre

16

Pour les fonctions simples:

def f(): # for demonstration 
    pass 

f.__doc__ = "Docstring!" 
help(f) 

Cela fonctionne dans les deux python2 et python3, sur les fonctions avec et sans docstrings définies. Vous pouvez également faire +=. Notez que c'est __doc__ et non __docs__.

Pour les méthodes, vous devez utiliser l'attribut __func__ de la méthode:

class MyClass(object): 

    def myMethod(self): 
     pass 

MyClass.myMethod.__func__.__doc__ = "A really cool method" 
+0

oh. J'ai essayé ça et ça n'a pas marché. Je vais essayer de nouveau. –

+0

Essayé cela et cela fonctionne parfaitement! Merci beaucoup! –

+4

J'ai essayé ceci sur une méthode de classe et ai obtenu une erreur. Il s'avère que sur une méthode de classe, ce que je pense est ce que veut la question originale, vous voudriez faire: self.method .__ func __.__ doc__ – noisygecko

2

Vous pouvez également utiliser setattr sur l'objet de classe/fonction et régler la docstring.

setattr(foo,'__doc__',"""My Doc string""") 
Questions connexes