2015-09-18 29 views
2

這個問題是關於click包的行爲選項:蟒蛇點擊:添加可修改其它參數

Click是一個Python包在一個組合的方式創造出美麗的命令行 接口與少代碼是必要的。它是 「命令行界面創建工具包」。它是高度可配置的 ,但帶有明智的默認設置。

它旨在使編寫命令行工具的過程變得快速並且有趣,同時還防止由於無法實現預期的CLI API而導致的任何挫敗感。

我想添加一個click.Option到我的click.Command,它改變了該命令的其他參數的行爲。考慮下面的例子:

@click.option('--x', default=42, prompt=True) 
@click.command 
def cli_a(x): 
    print(x) 


@click.option('--x', default=42, prompt=False) 
@click.command 
def cli_b(x): 
    print(x) 

如果cli_a被不帶明確指定x用戶被提示以提供一個值(或確認默認值與ENTER)。如果調用cli_b而未指定x,則會在不提示用戶的情況下使用默認值。

我現在想添加一個標誌click.Option,允許用戶在上述變體之一(在運行時)之間進行選擇。因此,撥打cli_c --i的行爲將與cli_a類似,撥打cli_c的行爲將類似cli_b

@click.option('--i', is_flag=True, default=False, expose_value=False) 
@click.option('--x', default=42, prompt=False) 
@click.command 
def cli_c(x): 
    print(x) 

是可行的與當前的API是什麼?這可行嗎?

一個類似的用例可能類似於anwser-all-confimation-prompts-with-yes標誌。通常情況下,如果cli工具應該可以由用戶以交互方式使用,並且通過腳本或其他類似工具以自動模式使用,則會出現這種情況。

回答

3

我想出了下面的代碼,從而產生所需的行爲:

def deactivate_prompts(ctx, param, value): 
    if not value: 
     click.echo("entering batch mode, deactivating all prompts ...") 
     for p in ctx.command.params: 
      if isinstance(p, click.Option) and p.prompt is not None: 
       p.prompt = None 
    return value 

@click.option('--i/--b', default=True, is_eager=True, expose_value=False, callback=deactivate_prompts) 
@click.option('--x', default=42, prompt=True) 
@click.command 
def cli_c(x): 
    print(x) 

的想法是使用一個熱心選項的回調修改Command的所有(其他)Options

潛在的弱點:

  • 這是一個全有或全無溶液,即或者所有提示的有活性或無。對於我的用例,這正是我想要的,但對於其他人可能並非如此。
  • 這隻適用於一個方向,即關閉提示。因此,每個Option可能會或可能不會顯示提示必須配置爲顯示提示。
  • 如果我們關閉提示,我們仍然需要一個值爲Option,所以一個替代的價值源是必須的。即必須提供默認值。