我想修改辅助函数为python2兼容

时间:2018-03-19 18:46:03

标签: python-3.x python-2.7 args

我想使用此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等价物。对此的任何想法都非常感激。

1 个答案:

答案 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,并且应该产生相同的结果。