web-dev-qa-db-fra.com

Pourquoi mon utilisation de click.argument génère-t-elle "un argument mot-clé inattendu" aide "?

L'exécution du code suivant entraîne cette erreur:

TypeError: init () a obtenu un argument de mot clé inattendu 'help'

Code:

import click

@click.command()
@click.argument('command', required=1, help="start|stop|restart")
@click.option('--debug/--no-debug', default=False, help="Run in foreground")
def main(command, debug):
    print (command)
    print (debug)

if __name__ == '__main__':
    main()

Sortie d'erreur complète:

$ python3 foo.py start
Traceback (most recent call last):
  File "foo.py", line 5, in <module>
    @click.option('--debug/--no-debug', default=False, help="Run in foreground")
  File "/home/cbetti/python/lib/python3/dist-packages/click-4.0-py3.4.Egg/click/decorators.py", line 148, in decorator
    _param_memo(f, ArgumentClass(param_decls, **attrs))
  File "/home/cbetti/python/lib/python3/dist-packages/click-4.0-py3.4.Egg/click/core.py", line 1618, in __init__
    Parameter.__init__(self, param_decls, required=required, **attrs)
TypeError: __init__() got an unexpected keyword argument 'help'

Pourquoi cette erreur se produit-elle?

22
Chris Betti

Je rencontre cela encore et encore parce que la sortie de trace ne correspond pas au paramètre à l'origine de l'erreur. Notez ArgumentClass dans la trace, c'est votre indice.

'help' est un paramètre acceptable pour @click.option. La bibliothèque de clics préfère cependant que vous documentiez vos propres arguments. Le @click.argumenthelp paramètre provoque cette exception.

Ce code fonctionne: (notez le manque de , help="start|stop|restart" dans @click.argument)

import click

@click.command()
@click.argument('command', required=1)
@click.option('--debug/--no-debug', default=False, help="Run in foreground")
def main(command, debug):
    """ COMMAND: start|stop|restart """
    print (command)
    print (debug)

if __name__ == '__main__':
        main()

Production:

$ python3 foo.py start
start
False

Sortie d'aide:

Usage: test.py [OPTIONS] COMMAND

  COMMAND: start|stop|restart

Options:
  --debug / --no-debug  Run in foreground
  --help                Show this message and exit.
31
Chris Betti

Vous définissez des commandes comme arguments. Notez que le clic a une meilleure façon de définir les commandes que ce que vous essayez ici.

@click.group()
def main():
    pass

@click.command()
def start():
    print "running command `start`"

@click.command()
def stop():
    print "running command `stop`"

main.add_command(start)
main.add_command(stop)

if __name__ == '__main__':
    main()

entraînera le texte d'aide par défaut suivant:

Usage: test.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  start
  stop

Cela dit, si vous avez vraiment besoin d'arguments, vous ne pouvez pas utiliser le paramètre help. La documentation de clic indique en effet que vous devez documenter vos propres arguments. Cependant, je ne sais pas comment faire ça. Des indices?

4
bartaelterman

la bibliothèque de clics ne permet pas -help paramètre à l'intérieur click.arguments (y compris la version actuelle 6.7 lorsque ce commentaire a été écrit). Mais, vous pouvez utiliser le -help paramètre à l'intérieur click.options.
Vous pouvez consulter la documentation actuelle sur les clics à http://click.pocoo.org/6/documentation/ ou précédente à http://click.pocoo.org/ 5/documentation / ce comportement n'a pas changé récemment. Ensuite, c'est un WAD. Ce n'est pas un BUG.

3
derwyddon

Pour la même erreur, je l'ai eu parce que mon nom d'argument était url_Hook (camelCase). Après l'avoir changé en url_hook, il a été résolu.

0
user1874480

Pour moi, c'était parce que ma variable ressemblait à DnsCryptExractDir et je dois aussi la modifier cette dnscryptexractdir parce que * args n'a pas pu la trouver.

0
sonance207