2016-05-18 8 views
9

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

+0

non sembra esso. Non puoi semplicemente creare un'opzione "tutto" e quindi chiamare tutte le altre funzioni dall'interno di quell'opzione? – Charlie

+1

@Charlie: sì, ma l'utente potrebbe quindi mettere "--all --color rosso" sulla riga di comando e questo non sembra giusto. – Bryce

+0

OK - dimmi di più. Cosa si suppone che accada se lo fanno? Forse potresti scrivere un codice di esempio. – Charlie

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.