2016-11-23 48 views
3

我正在使用一個小命令行工具,使用Python 2click。我的工具需要寫入一個值,讀取它,或者不要更改它。這將是很好,如果我能做到以下幾點:python click,make option value optional

mytool --r0=0xffff ..........設定值r00xffff
mytool --r0 ................ ......讀取值r0
mytool ...............................不要對r0

根據文檔,這似乎不可能,但我可能錯過了它。那麼是否有可能或者我必須找到一種不同的方法?

+0

'@ click.option( ' - 計數',默認值= 1,幫助= '問候數')' – Koga

+0

@Koga是啊,我有同樣的想法,但我想知道如果我不使用'default'就可以做這樣的事情。 – flashburn

+0

爲什麼你不想使用'default'? – Koga

回答

0

解決此問題的一種方法是引入另一個名爲r0_set的參數。然後保存所需的命令行,我們可以從click.Command,並在乘坐parse_args繼承把用戶輸入r0=0xffffr0_set=0xffff

代碼:

class RegisterReaderOption(click.Option): 
    """ Mark this option as getting a _set option """ 
    register_reader = True 

class RegisterWriterOption(click.Option): 
    """ Fix the help for the _set suffix """ 
    def get_help_record(self, ctx): 
     help = super(RegisterWriterOption, self).get_help_record(ctx) 
     return (help[0].replace('_set ', '='),) + help[1:] 

class RegisterWriterCommand(click.Command): 
    def parse_args(self, ctx, args): 
     """ Translate any opt= to opt_set= as needed """ 
     options = [o for o in ctx.command.params 
        if getattr(o, 'register_reader', None)] 
     prefixes = {p for p in sum([o.opts for o in options], []) 
        if p.startswith('--')} 
     for i, a in enumerate(args): 
      a = a.split('=') 
      if a[0] in prefixes and len(a) > 1: 
       a[0] += '_set' 
       args[i] = '='.join(a) 

     return super(RegisterWriterCommand, self).parse_args(ctx, args) 

測試代碼:

@click.command(cls=RegisterWriterCommand) 
@click.option('--r0', cls=RegisterReaderOption, is_flag=True, 
       help='Read the r0 value') 
@click.option('--r0_set', cls=RegisterWriterOption, 
       help='Set the r0 value') 
def cli(r0, r0_set): 
    click.echo('r0: {} r0_set: {}'.format(r0, r0_set)) 

cli(['--r0=0xfff', '--r0']) 
cli(['--help']) 

結果:

r0: True r0_set: 0xfff 

Usage: test.py [OPTIONS] 

Options: 
    --r0  Read the r0 value 
    --r0=TEXT Set the r0 value 
    --help  Show this message and exit. 
相關問題