如何确定在plac中设置了哪些命令行参数?

时间:2015-08-30 23:08:32

标签: python argparse

我的Python脚本按此顺序获取配置值:

  1. 命令行参数(覆盖配置文件中用户定义值的可能性)
  2. 配置文件值(用户定义的值)
  3. 源代码中的默认值
  4. 我需要弄清楚在命令行上设置了哪个选项,以确定是否已明确设置默认值。 plac [不是?]非常透明,我不知道它是如何可能的。我想避免解析sys.argv,因为编写命令行解析器以使用命令行解析器似乎不是一个好主意。

    我在plac上使用Ubuntu 15.04 0.9.1。

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个对象列表。