Comment puis-je définir par programmation la docstring?
J'ai un wrapper fonction qui retourne une fonction. Est-il un moyen de définir par programmation la docstring de retour de la fonction? Si je pouvais écrire à __doc__
je ferais le suivant:
def wrapper(a):
def add_something(b):
return a + b
add_something.__doc__ = 'Adds ' + str(a) + ' to `b`'
return add_something
Ensuite, j'ai pu faire
>>> add_three = wrapper(3)
>>> add_three.__doc__
'Adds 3 to `b`
Cependant, depuis __doc__
est en lecture seule, je ne peux pas le faire. Quelle est la façon correcte?
Edit: Ok, je voulais garder cela simple, mais bien sûr, ce n'est pas ce que je suis en train d'essayer de faire. Même si, en général, __doc__
est inscriptible dans mon cas, il n'est pas.
Je suis en train de créer des cas de tests pour unittest
automatiquement. J'ai une fonction wrapper qui crée un objet de classe est une sous-classe de unittest.TestCase
:
import unittest
def makeTestCase(filename, my_func):
class ATest(unittest.TestCase):
def testSomething(self):
# Running test in here with data in filename and function my_func
data = loadmat(filename)
result = my_func(data)
self.assertTrue(result > 0)
return ATest
Si j'ai créer cette classe et d'essayer de régler la docstring de testSomething
j'obtiens une erreur:
>>> def my_func(): pass
>>> MyTest = makeTestCase('some_filename', my_func)
>>> MyTest.testSomething.__doc__ = 'This should be my docstring'
AttributeError: attribute '__doc__' of 'instancemethod' objects is not writable
- Pourquoi ne pas simplement écrire une docstring?
- Parce qu'alors, si vous le mettez à jour, vous devez toujours vous rappeler de mettre à jour manuellement tous les autres exemplaires dans toutes les autres fonctions wrapper
Vous devez vous connecter pour publier un commentaire.
J'aimerais passer la docstring dans l'usine de la fonction et de l'utilisation
type
construire manuellement la classe.Un
instancemethod
obtient son docstring de son__func__
. Modifier la docstring de__func__
à la place. (Le__doc__
attribut de fonctions sont accessible en écriture.)De la 2.7 docs:
Suffit d'utiliser les décorateurs. Voici votre cas:
Voici un semblable cas d'utilisation: Python aide dynamique et de saisie semi-automatique de génération de
C'est un plus pour le fait que le
__doc__
attribut des classes de typetype
ne peut pas être modifié. Le point intéressant est que ce n'est vrai que tant que la classe est créée à l'aide de type. Dès que vous utilisez une métaclasse vous pouvez en fait juste changer__doc__
.L'exemple utilise l'abc (AbstractBaseClass) du module. Il fonctionne à l'aide d'un
ABCMeta
métaclasseentraînera
Je suppose que ce doit être un commentaire, mais encore à ramasser mes 50 premiers points...
__doc__
n'est pas accessible en écriture uniquement lorsque votre objet est de type 'type'.Dans votre cas,
add_three
est une fonction et que vous pouvez simplement mettre en__doc__
à n'importe quelle chaîne.Dans le cas où vous essayez de générer automatiquement unittest.Cas de test sous-classes, vous pouvez avoir plus de kilométrage primordial de leur shortDescription méthode.
C'est la méthode qui supprime le sous-jacent docstring vers le bas de la première ligne, comme on le voit dans la normale unittest de sortie; si c'était assez pour nous donner le contrôle sur ce qu'a montré dans des outils de reporting comme TeamCity, qui était ce dont nous avions besoin.