[英]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已通过Python 2.5、2.6、2.7、3.2、3.3和PyPy进行了测试。
您最好的选择是坚持只有一个命令行参数解析库。
optparse
在Python 3.3和3.4中仍然可用,并且尚未发布何时将其删除的公告。 是的,它已被弃用,不会收到新版本,但仍然可以正常工作。
当您需要支持如此广泛的Python版本时,请勿尝试重复工作。 如果你的需求被满足optparse
, 只使用optparse
。
您可以将解析器类分配给变量,并将猴子补丁OptionParser
给add_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.