Come posso creare un gruppo di opzioni che si escludono a vicenda in Click? Voglio accettare il flag "--all" o prendere un'opzione con un parametro come "--color red".Gruppi di opzioni che si escludono a vicenda in python Fare clic su
9
A
risposta
12
Mi sono imbattuto in questo stesso caso d'uso di recente; questo è quello che mi è venuto in mente. Per ciascuna opzione, puoi fornire un elenco di opzioni in conflitto.
from click import command, option, Option, UsageError
class MutuallyExclusiveOption(Option):
def __init__(self, *args, **kwargs):
self.mutually_exclusive = set(kwargs.pop('mutually_exclusive', []))
help = kwargs.get('help', '')
if self.mutually_exclusive:
ex_str = ', '.join(self.mutually_exclusive)
kwargs['help'] = help + (
' NOTE: This argument is mutually exclusive with '
' arguments: [' + ex_str + '].'
)
super(MutuallyExclusiveOption, self).__init__(*args, **kwargs)
def handle_parse_result(self, ctx, opts, args):
if self.mutually_exclusive.intersection(opts) and self.name in opts:
raise UsageError(
"Illegal usage: `{}` is mutually exclusive with "
"arguments `{}`.".format(
self.name,
', '.join(self.mutually_exclusive)
)
)
return super(MutuallyExclusiveOption, self).handle_parse_result(
ctx,
opts,
args
)
Quindi utilizzare il normale option
decoratore ma passare l'argomento cls
:
@command(help="Run the command.")
@option('--jar-file', cls=MutuallyExclusiveOption,
help="The jar file the topology lives in.",
mutually_exclusive=["other_arg"])
@option('--other-arg',
cls=MutuallyExclusiveOption,
help="The jar file the topology lives in.",
mutually_exclusive=["jar_file"])
def cli(jar_file, other_arg):
print "Running cli."
print "jar-file: {}".format(jar_file)
print "other-arg: {}".format(other_arg)
if __name__ == '__main__':
cli()
Here's a gist che include il codice precedente e mostra un output eseguirlo.
Se ciò non funzionerà per voi, ci sono anche alcuni (chiusi) problemi che menzionano questo nella pagina click github con un paio di idee che potreste essere in grado di utilizzare.
Problemi correlati
- 1. Come rendere Python argparse argomenti di gruppo che si escludono a vicenda senza prefisso?
- 2. Le regole StyleCop e FxCop si escludono a vicenda
- 3. Le proprietà di binding WPF Path e XPath si escludono a vicenda?
- 4. Perché l'attributo title html e i dati bootstrap twitter-original-title si escludono a vicenda?
- 5. Funzioni che si escludono reciprocamente chiamando l'un l'altro
- 6. matplotlib: come si fa a fare clic su shift?
- 7. Impostare il valore predefinito su false se un altro argomento che si esclude a vicenda è vero
- 8. Fare clic su OPPURE, quindi fare qualcosa
- 9. Fare clic su visualizzazioni a livello di programmazione in Android
- 10. android uiautomator per fare clic su ListView
- 11. AngularJS Fare clic su TouchStart
- 12. opzioni mutualmente esclusive che utilizzano Apache Commons CLI
- 13. Come si fa a Dir.glob ma si escludono le directory?
- 14. Ottenere un riferimento a ViewHolder su RecyclerView Fare clic su
- 15. Capture RatingBar Fare clic su
- 16. Non riesco a fare clic su ListView in Android?
- 17. Fare clic su un pulsante a livello di codice - JS
- 18. JS interrompe l'evidenziazione che si verifica su (doppio) fare clic su
- 19. Clic su Python, puoi fare -h come alias
- 20. Fare clic su un menu a tendina con Selenium Webdriver
- 21. Fare clic su evento in UserControl- WPF
- 22. gruppi di opzioni mutualmente esclusive spinta opzioni del programma
- 23. Selenio - Fare clic in una determinata posizione
- 24. Python optparse, i valori di default, e le opzioni esplicite
- 25. PyQt, fare clic su azione su QWidget
- 26. Espressioni regolari Python che assegnano a gruppi denominati
- 27. Winforms Fare clic su Evento non attivato
- 28. Do Underscore.js e jQuery si completano a vicenda?
- 29. cattura fare clic su div che circonda un iframe
- 30. I gruppi di sicurezza AWS su un account AWS possono fare riferimento a gruppi di sicurezza in un altro?
non sembra esso. Non puoi semplicemente creare un'opzione "tutto" e quindi chiamare tutte le altre funzioni dall'interno di quell'opzione? – Charlie
@Charlie: sì, ma l'utente potrebbe quindi mettere "--all --color rosso" sulla riga di comando e questo non sembra giusto. – Bryce
OK - dimmi di più. Cosa si suppone che accada se lo fanno? Forse potresti scrivere un codice di esempio. – Charlie