[英]Python: argument parser that handles global options to sub-commands properly
[英]Defining common options for sub-commands with plac
我的問題基本上是對這個問題的后續行動。 這顯示了如何使用plac
自動生成一個命令行界面,其中子命令代表每個函數。
是否有可能告訴plac
所有子命令共有的選項,並且可以被視為“全局”選項? 實際上,這些選項在沒有子命令的情況下應該具有意義。
舉個例子,我可能有svn checkout
和svn update
子命令,但也喜歡svn -v
或svn --version
命令。
幾年前,我使用plac
設置了一個多處理腳本。 它有多個命令,包含重疊的參數集。 我會嘗試抽象我做的事情
class Interface(object):
commands = ['fn1','fn2',...]
dict1 = dict(quiet=(...), dryrun=(...), ...)
dict2 = dict()
dict3 = dict()
dict1.update(dict2)
@plac.annotations(**dict1)
def fn1(self, dryrun, quiet, ...)
...
@plac.annotations(foo=(...), **dict2)
def fn2(self, foo, ...)
...
@plac.annotations(**dict2)
def fn3(self, ...)
...
因此,雖然每個函數的參數必須完整拼寫,但注釋可以通過混合和匹配各種字典來構建。
我在plac
生銹了,所以我將首先從基本的argparse
用法中解決這個問題。
p = argparse.ArgumentParser(version='1.2.3')
sp = p.add_subparser()
sp.add_parser('checkout')
sp.add_parser('update')
p.parse_args(['-v'])
返回1.2.3
並退出。 但是-v
就像-h
,一個特殊的論點。
p.parse_args([])
雖然給出了too few arguments
錯誤。 即它需要一個子命令。 如果“全局選項”類似於-d
。
幾個資格:
新版本以不同的方式指定“版本”參數。
在3.3
,不再需要子命令。 這是由於必需參數錯誤消息的更改,並且可能/或可能不適用於將來的更改。
我認為如果解析器是由plac
生成的,這些限制仍然適用,但我必須檢查plac
代碼以確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.