我的Python
脚本按此顺序获取配置值:
我需要弄清楚在命令行上设置了哪个选项,以确定是否已明确设置默认值。 plac [不是?]非常透明,我不知道它是如何可能的。我想避免解析sys.argv
,因为编写命令行解析器以使用命令行解析器似乎不是一个好主意。
我在plac
上使用Ubuntu 15.04
0.9.1。
答案 0 :(得分:0)
您能举一个简单的plac
设置示例吗?我曾经很清楚,但现在更了解基础的argparse
。
您是否正在使用plac
直接调用函数,例如。
plac.call(main)
内部plac
创建一个argparse.ArgumentParser
(实际上是它自己的子类),使用从函数签名派生的参数填充它。然后使用它解析的值调用该函数。
如果直接使用argparse
,则创建解析器,填充它并使用
args = parser.parse_args()
args
现在是一个Namespace
对象,其参数以参数命名。它也可以转换为字典。
如果您转到argparse
路线(可能仍然使用plac
创建解析器),您可以轻松检查args
中的属性,并将这些值与默认值进行比较,或与config
文件值。
IPython
实际上使用从配置文件(默认和自定义)派生的参数填充argparse.parser
。这使您可以在多个阶段超越配置默认值 - 使用自定义文件或使用命令行。
plac
应该比argparse
更容易。但在你的情况下,将这些步骤分开可能会更好。
plac.call
的代码是:
def call(obj, arglist=sys.argv[1:], eager=True):
...
cmd, result = parser_from(obj).consume(arglist)
...
第一部分创建一个解析器;此解析器的参数基于注释装饰器。我的测试中的main
来自plac
文档。
In [22]: p=plac.parser_from(main)
In [23]: p
Out[23]: ArgumentParser(prog='ipython2.7', usage=None, description=None, version=None, formatter_class=<class 'argparse.RawDescriptionHelpFormatter'>, conflict_handler='error', add_help=True)
p.consume
是一个更长的函数,可以检查subparsers之类的东西。但在某些时候它确实
ns, extraopts = self.parse_known_args(arglist)
# or self.parse_args
ns
是一个argparse命名空间,其参数由解析器设置 - 默认值和命令行中的参数。然后它使用ns
中的值调用“函数”(拆分为Python
位置args和关键字args)。
所以你可以直接调用该解析器:
In [25]: p.parse_args([]) # or with the default sys.argv[1:]
Out[25]: Namespace(args=[], kw={}, opt=None)
p.print_help()
还会显示命令行所期望的参数,但格式整齐。
如果您想进一步了解argparse
内容,可以查看p._actions
,它用于解析命令行的argparse.Action
个对象列表。