我有以下代码
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
的相同代码。任何帮助将不胜感激。
答案 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