PEP8和使用长关键字参数初始化对象

时间:2014-08-29 00:25:56

标签: python argparse pep8

在我看来,如果不违反PEP8或混淆您的命名空间,就无法轻松使用RawDescriptionHelpFormatter模块中的argparse

以下是最明显的格式化方式:

parser = argparse.ArgumentParser(prog='PROG',
                                 ....
                                 formatter_class=argparse.RawDescriptionHelpFormatter)

这违反了行不应超过80个字符的规定

以下是argparse文档中的示例(剧透:这实际上是正确的;请参阅下面的评论):

parser = argparse.ArgumentParser(
    prog='PROG',
    formatter_class=argparse.RawDescriptionHelpFormatter,
    ....

这违反了PEP8 E128关于延续线的缩进。

在这里'另一种可能性:

parser = argparse.ArgumentParser(
    prog='PROG',
    formatter_class=
    argparse.RawDescriptionHelpFormatter,
    ....

对于关键参数,这违反了=周围空格的PEP8 E251。

(当然,这甚至没有解决这样一个事实:我的行的字符数假定parser令牌从第一列开始,这是最好的情况;如果我们怎么办?想在类和/或函数中创建解析器吗?)

因此,据我所知,唯一剩下的替代方案是使命名空间混乱:

from argparse import RawDescriptionHelpFormatter, ArgumentParser

...或使用愚蠢的临时变量(也会使命名空间变得混乱):

rawformatter = argparse.RawDescriptionHelpFormatter
parser = argparse.ArgumentParser(prog='PROG',
                                 ....
                                 formatter_class=rawformatter)

我错过了什么吗?我想在当前命名空间中直接使用RawDescriptionHelpFormatter和ArgumentParser并不是什么大不了的事,但这似乎是一种不必要的挫折。

2 个答案:

答案 0 :(得分:2)

你的第二个例子对我来说很好看,而且似乎与#34;#Hanging indents应该添加一个级别。"例如:http://legacy.python.org/dev/peps/pep-0008/#indentation

似乎与这个类似的问题/答案相符:What is PEP8's E128: continuation line under-indented for visual indent?

答案 1 :(得分:1)

其他几种变体:

from argparse import RawDescriptionHelpFormatter as formatter

parser = argparse.ArgumentFormatter(prog='PROG')
# you can reassign a parser attribute after initialization
parser.formatter_class = formatter 

ArgumentParser还有其他输入可能足够长,需要包装或赋值给单独的变量。

usage = 'PROG [-h] --foo FOO BAR etc'
description = """\
This is a long multiline description
that may require dedenting.
"""
description = textwrap.dedent(description)
parser=Argparse(usage=usage, description=description, formatter_class=formatter)

看一下test_argparse.py,看看可以定义长而多面的解析器的多种方法。


http://bugs.python.org/issue13023提出了如果你想要几个格式化程序修改的问题,例如:

  

这意味着我们可以传递argparse.RawDescriptionHelpFormatter或argparse.ArgumentDefaultsHelpFormatter,但不能同时传递两者。

推荐的解决方案是将格式化程序子类化:

class MyFormatter(argparse.RawDescriptionHelpFormatter, 
    argparse.ArgumentDefaultsHelpformatter):
    pass

保持名称空间清洁的另一种策略是将解析器定义包装在函数或模块中。

http://ipython.org/ipython-doc/2/api/generated/IPython.core.magic_arguments.html

IPython包装argparse如何为其用户创建新API的示例。

另一个基于argparse构建的解析器,plac首先构建一个cfg字典:

https://code.google.com/p/plac/source/browse/plac_core.py

def pconf(obj):
    ...
    cfg = dict(description=obj.__doc__, 
               formatter_class=argparse.RawDescriptionHelpFormatter)
    ...
    return cfg

def parser_from(obj, **confparams):
    ...
    conf = pconf(obj).copy()
    conf.update(confparams)
    parser = ArgumentParser(**conf)