J'utilise Python 3 et je veux encapsuler argparse.ArgumentParser
Avec une classe personnalisée qui définit formatter_class=argparse.RawDescriptionHelpFormatter
Par défaut. Je peux le faire avec succès, cependant IntelliJ IDEA 2017.1 avec Python Plugin (PyCharm) donne un avertissement pour le code suivant:
class CustomParser(argparse.ArgumentParser):
def __init__(self, formatter_class=argparse.RawDescriptionHelpFormatter, **kwargs):
# noinspection PyArgumentList
super().__init__(formatter_class=formatter_class, **kwargs) # warning in this line for the last argument if suppression comment above removed
Si l'on supprime le commentaire avec la commande de suppression IntelliJ, l'avertissement sur kwargs est "Attendu un dictionnaire, a obtenu un dict", mais cela fonctionne. S'agit-il d'un faux avertissement positif ou cela peut-il être mieux fait sans l'avertissement? Y a-t-il un vrai problème derrière cet avertissement qu'il aide à éviter?
Question secondaire: y a-t-il une différence dans l'utilisationformatter_class = kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter)
au lieu de définir explicitement le paramètre nommé dans la signature? Selon PEP2 plus explicite dans la signature, c'est mieux, non?
Oui, cela semble être un faux positif.
Vous avez posé des questions sur formatter_class=kwargs.pop('formatter_class', argparse.RawDescriptionHelpFormatter)
. S'il vous plaît ne faites pas ça. La mutation de kwargs
, qui apparaît comme argument suivant, semble incorrecte. De plus, les arguments de mot clé par défaut doivent être définis sur une constante simple plutôt que sur une structure de données modifiable, car il existe une grande différence entre l'évaluation au moment de l'importation et l'évaluation au moment de l'exécution. Voir par exemple http://www.effbot.org/zone/default-values.htm . L'idiome habituel serait formatter_class=None
dans la signature, puis dans le corps, vous testez Aucun et vous mutez les kwargs à votre guise.