Il existe de nombreux modules Python pour analyser et coordonner les options de ligne de commande (argparse, getopt, blargs, etc.). Et Python a la chance de posséder de bonnes fonctionnalités/idiomes intégrés pour gérer des arguments de fonction variés (par exemple, valeurs par défaut, *varargs, **keyword_args). Mais lorsque je lis le code de divers projets pour les fonctions de haut niveau, je constate que les arguments de fonction sont nettement moins disciplinés et standardisés que les arguments de ligne de commande.
Pour les fonctions simples, ce n'est pas un problème ; les fonctions d'arguments intégrées fonctionnent très bien et sont plus que suffisantes. Mais il existe de nombreux modules riches en fonctionnalités dont les fonctions de premier niveau fournissent de nombreux arguments et options différents (certains complémentaires ou exclusifs), différents modes de fonctionnement, des valeurs par défaut, des surcharges, etc. En d'autres termes, ils ont une complexité d'arguments proche de celle des arguments de la ligne de commande. Et ils semblent largement gérer leurs arguments dans ad hoc moyens.
Compte tenu du nombre de modules de traitement en ligne de commande existants, et de leur raffinement au fil du temps, je m'attendais à ce qu'il y ait au moins quelques modules permettant de simplifier la gestion des arguments de fonctions compliquées. Mais j'ai cherché dans PyPi, stackoverflow, et Google sans succès. Alors... y a-t-il des modules de gestion des arguments de fonction (pas de ligne de commande !) que vous recommanderiez ?
--mise à jour avec l'exemple--
Il est difficile de donner un exemple concret vraiment simple, car le cas d'utilisation n'apparaît que lorsque l'on a affaire à un module sophistiqué. Mais voici un essai pour expliquer le problème en code : Un module de formatage avec des valeurs par défaut qui peuvent être surchargées lors de l'instanciation du formatage, ou lorsque la fonction/méthode est appelée. Pour n'avoir que quelques options, il y a déjà beaucoup de verbiage sur la gestion des options et les noms des options sont répétés. ad nauseam .
defaults = { 'indent': 4,
'prefix': None,
'suffix': None,
'name': 'aFormatter',
'reverse': False,
'show_name': False
}
class Formatter(object):
def __init__(self, **kwargs):
self.name = kwargs.get('name', defaults['name'])
self.indent = kwargs.get('indent', defaults['indent'])
self.prefix = kwargs.get('prefix', defaults['prefix'])
self.suffix = kwargs.get('suffix', defaults['suffix'])
self.reverse = kwargs.get('reverse', defaults['reverse'])
self.show_name = kwargs.get('show_name', defaults['show_name'])
def show_lower(self, *args, **kwargs):
indent = kwargs.get('indent', self.indent) or 0
prefix = kwargs.get('prefix', self.prefix)
suffix = kwargs.get('suffix', self.suffix)
reverse = kwargs.get('reverse', self.reverse)
show_name = kwargs.get('show_name', self.show_name)
strings = []
if show_name:
strings.append(self.name + ": ")
if indent:
strings.append(" " * indent)
if prefix:
strings.append(prefix)
for a in args:
strings.append(a.upper() if reverse else a.lower())
if suffix:
strings.append(suffix)
print ''.join(strings)
if __name__ == '__main__':
fmt = Formatter()
fmt.show_lower("THIS IS GOOD")
fmt.show_lower("THIS", "IS", "GOOD")
fmt.show_lower('this IS good', reverse=True)
fmt.show_lower("something!", show_name=True)
upper = Formatter(reverse=True)
upper.show_lower("this is good!")
upper.show_lower("and so is this!", reverse=False)