Python:如何编写外观美观并能与argparse或optparse一起工作的代码?

2024-05-23 17:48:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须解析参数,所以我使用了argparse模块。这在python3.3和python2.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

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

^{pr2}$

这会有一点帮助,但也许有更好的方法来编写这样的代码。有什么想法吗?在


Tags: storeadddefaultparserurltimeoutargparsehelp
3条回答

你考虑过把你的论点分开存放吗?在

 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"'}
         }, ...]

然后,无论使用哪个库,都可以调用:

^{pr2}$

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

^{3}$

最好的选择是只使用一个命令行参数解析库。在

optparse在python3.3和3.4中仍然可用,并且还没有宣布何时删除它(如果有的话)。是的,它已被弃用,不会收到新版本,但它仍然可以正常工作。在

当您需要支持如此广泛的Python版本时,不要试图重复工作。如果您的需求是由optparse来满足的,那么使用就可以了。在

如果您不介意使用第三方库,我建议您尝试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 is tested with Python 2.5, 2.6, 2.7, 3.2, 3.3 and PyPy.

Docopt is also successfully used with Jython!在

相关问题 更多 >