我想使用此CLI模板 https://mike.depalatis.net/blog/simplifying-argparse.html 用于创建用于访问EMC Unity REST API的工具。
它似乎是用python3编写的。特别是参数辅助函数。
def argument(*name_or_flags, **kwargs):
return ([*name_or_flags], kwargs)
我不相信我完全理解参数函数应该如何工作,因此我如何修改它以使用python2。
e.g。如果我有一个函数create_lun有几个选项,我想我需要参数来返回一个定义的参数列表,因此我会这样装饰它:
@subcommand([argument('-o', '--pool', dest='pool', default="pool_1",
type=str, help='Name of Pool of str arg'),
argument('lun_name', metavar='lun_name', type=str,
help='Name of LUN to create in format: ldom-vol#')])
def create_lun(args):
因此cli.py create_lun lun_name将创建lun,而-h将显示此语法。
如果这个假设是正确的,我需要将python3的能力转换为
return ([*name_or_flags], kwargs)
进入python2.7等价物。对此的任何想法都非常感激。
答案 0 :(得分:1)
该行
return ([*name_or_flags], kwargs)
与
相同return [*name_or_flags], kwargs
与
相同return name_or_flags, kwargs
在python 3中,语法[*a_list]
将列表的元素扩展为新的列表文字。它的目的是将现有列表插入新列表,而不是简单地制作列表副本。
In [1]: a = list(range(9))
In [2]: a
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8]
In [3]: [*a]
Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8]
In [4]: ['hey', *a, 'there']
Out[4]: ['hey', 0, 1, 2, 3, 4, 5, 6, 7, 8, 'there']
写[*name_or_flags]
似乎是一种混淆的尝试。可能作者想要创建name_or_flags
的新副本,在这种情况下,切片就足够了:
def argument(*name_or_flags, **kwargs):
return name_or_flags[:], kwargs
如果不需要副本,那么以下就足够了。
def argument(*name_or_flags, **kwargs):
return name_or_flags, kwargs
这适用于Python2和Python3,并且应该产生相同的结果。