繁体   English   中英

Python:如何编写美观且可与argparse或optparse一起使用的代码?

[英]Python: how to write code that looks nicely and works with argparse or optparse?

我必须解析参数,所以我使用了argparse模块。 这适用于Python 3.3和Python 2.7。 但有一段时间我必须将它与Jython一起使用,而Jython的最后一个稳定版本是2.5.3。 这个版本没有argparse模块,所以我用了较旧的optparse模块:

args = None
try:
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("-u", "--url", action="store", dest="url", default=url, help='test script URL like "http://127.0.0.1/isof/hdb_ver_xml.hdb" or "hdb://127.0.0.1/isof/hdb_ver_xml.hdb"')
    parser.add_argument("-t", "--threads", action="store", type=int, dest="threads_cnt", default=threads_cnt, help='threads count')
    parser.add_argument("-T", "--timeout", action="store", type=int, dest="timeout_minutes", default=timeout_minutes, help='timeout in minutes')
    args = parser.parse_args()
except:
    import optparse
    parser = optparse.OptionParser()
    parser.add_option("-u", "--url", action="store", dest="url", default=url, help='test script URL like "http://127.0.0.1/isof/hdb_ver_xml.hdb" or "hdb://127.0.0.1/isof/hdb_ver_xml.hdb"')
    parser.add_option("-t", "--threads", action="store", type=int, dest="threads_cnt", default=threads_cnt, help='threads count')
    parser.add_option("-T", "--timeout", action="store", type=int, dest="timeout_minutes", default=timeout_minutes, help='timeout in minutes')
    args, _ = parser.parse_args()
return args

对我来说,这段代码很难看,因为任何更改都必须在2个地方进行。 当然我可以使用类似的东西:

OPT_THREADS_HELP = 'threads count'
...
... help=OPT_THREADS_HELP

这会有所帮助,但也许有更好的方式编写此类代码。 任何想法?

您是否考虑过分别存储您的参数?

 args = [{"args":("-u", "--url"), 
          "kwargs": {"action": "store", "dest": "url", "default": url, 
                     "help": 'test script URL like "http://127.0.0.1/isof/hdb_ver_xml.hdb" or "hdb://127.0.0.1/isof/hdb_ver_xml.hdb"'}
         }, ...]

然后,无论您使用哪个库,都可以致电:

try:
    import argparse
    parser = argparse.ArgumentParser()
    for arg in args:
        parser.add_argument(*arg['args'], **arg['kwargs'])
except:
    import optparse
    parser = optparse.OptionParser()
    for arg in args:
        parser.add_option(*arg['args'], **arg['kwargs'])

您可以进一步简化,允许您通过单独使用绑定方法来减少try块中的代码:

try:
    import argparse
except ImportError:
    import optparse
    parser = optparse.OptionParser()
    add_func = parser.add_option
else:
    parser = argparse.ArgumentParser()
    add_func = parser.add_argument

for arg in args:
    add_func(*arg["args"], **arg["kwargs"])

如果您不介意使用第三方库,建议您尝试docopt:

那你是怎么做的:

"""Naval Fate.

Usage:
  naval_fate.py ship new <name>...
  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
  naval_fate.py ship shoot <x> <y>
  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
  naval_fate.py (-h | --help)
  naval_fate.py --version

Options:
  -h --help     Show this screen.
  --version     Show version.
  --speed=<kn>  Speed in knots [default: 10].
  --moored      Moored (anchored) mine.
  --drifting    Drifting mine.

"""
from docopt import docopt


if __name__ == '__main__':
    arguments = docopt(__doc__, version='Naval Fate 2.0')
    print(arguments)

docopt

docopt已通过Python 2.5、2.6、2.7、3.2、3.3和PyPy进行了测试。

Docopt也成功用于Jython

您最好的选择是坚持只有一个命令行参数解析库。

optparse在Python 3.3和3.4中仍然可用,并且尚未发布何时将其删除的公告。 是的,它已被弃用,不会收到新版本,但仍然可以正常工作。

当您需要支持如此广泛的Python版本时,请勿尝试重复工作。 如果你的需求被满足optparse使用optparse

您可以将解析器类分配给变量,并将猴子补丁OptionParseradd_argument

像这样:

try:
    import argparse
    Parser = argparse.ArgumentParser
except ImportError:
    import optparse
    Parser = optparse.OptionParser
    Parser.add_argument = Parser.add_option


parser = Parser()
parser.add_argument("-u", "--url", action="store", dest="url", default=url, help='test script URL like "http://127.0.0.1/isof/hdb_ver_xml.hdb" or "hdb://127.0.0.1/isof/hdb_ver_xml.hdb"')
parser.add_argument("-t", "--threads", action="store", type=int, dest="threads_cnt",default=threads_cnt, help='threads count')
parser.add_argument("-T", "--timeout", action="store", type=int, dest="timeout_minutes", default=timeout_minutes, help='timeout in minutes')

args, _ = parser.parse_args()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM