用Gooey解析列表

时间:2017-01-27 19:32:45

标签: python python-2.7

我有以下代码

import argparse
from gooey import Gooey, GooeyParser


def get_args():
    """Get CLI arguments and options"""
    parser = GooeyParser(description='error test' ,
                         formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('--input', help='List of values',
                        default=['a', 'b', 'c'])

    args = parser.parse_args()

    return args


@Gooey()
def main():

    args = get_args()

    l = args.input

    for count, each in enumerate(l):
        print each

if __name__ == "__main__":
    main()

不幸的是它返回:

[
'
a
'
,

'
b
'
,

'
c
'
]

如果我使用相同的代码但注释掉@Gooey装饰器,我会得到:

a
b
c

如果我执行以下操作:

import argparse
import ast
from gooey import Gooey, GooeyParser


def get_args():
    """Get CLI arguments and options"""
    parser = GooeyParser(description='error test' ,
                         formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('--input', help='List of values',
                        default=['a', 'b', 'c'])

    args = parser.parse_args()

    return args


@Gooey()
def main():

    args = get_args()

    l = ast.literal_eval(args.input)

    for count, each in enumerate(l):
        print each

if __name__ == "__main__":
    main()

它返回:

a
b
c

但使用相同的代码并注释掉@Gooey装饰器会产生:

Traceback (most recent call last):
File "/Users/alex/Source/AT_analyzer/test.py", line 30, in <module>
main()
File "/Users/alex/Source/AT_analyzer/test.py", line 24, in main
l = ast.literal_eval(args.input)
File "/Users/alex/anaconda3/envs/at_analyzer_env/lib/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/Users/alex/anaconda3/envs/at_analyzer_env/lib/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string

我希望能够使用带有和不带Gooey的相同代码。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题与results.input中返回的数据类型有关。

以下代码使用Gooey,结果为<type 'str'>

import argparse
import ast
from gooey import Gooey, GooeyParser


def get_args():
    """Get CLI arguments and options"""
    parser = GooeyParser(description='error test',
                         formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('--input', help='List of values',
                        default=['a', 'b', 'c'])

    results = parser.parse_args()

    return results


@Gooey()
def main():

    results = get_args()
    print(type(results.input))

if __name__ == "__main__":
    main()

简单地评论@Gooey装饰器会导致results.input的数据类型更改为<type 'list'>

以下内容适用于使用@Gooey装饰器以及何时注释掉。

import argparse
import ast
from gooey import Gooey, GooeyParser


def get_args():
    """Get CLI arguments and options"""
    parser = GooeyParser(description='error test',
                         formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('--input', help='List of values',
                        default=['a', 'b', 'c'])

    results = parser.parse_args()

    return results


@Gooey()
def main():

    results = get_args()

    l = ast.literal_eval(str(results.input))

    for count, each in enumerate(l):
        print each

if __name__ == "__main__":
    main()

这是有效的,因为无论results.input是作为列表还是字符串返回,它都会显式转换为字符串,然后使用ast.literal_eval

作为列表进行评估