Python中提示用户将项目输入空列表并确保评估条目以纠正数据类型的最佳方法是什么?
例如,用户输入以下int
,float
,str
和list
项值组合:
24
190.45
'steve'
'steve smith'
['4A', '7B']
new_list
变为[24, 190.45, 'steve', 'steve smith', ['4A', '7B']]
我尝试了两种方法,每种方法都有重大问题。
方法1 - 要求用户输入列表项的空格分隔行,使用eval()
正确评估和存储数据类型,并使用str.split()
将字符串拆分为组件使用' '
作为分隔符的项目:
# user enters values separated by spaces
input_list = [eval(l) for l in(raw_input('Enter the items for your list separated by spaces: ').split())]
# check by printing individual items with data type and also complete list
for item in input_list:
print item, type(item)
print input_list
但是,从安全角度来看,我理解使用eval()
并不好。同时使用' '
分隔符进行拆分意味着我无法输入类似'steve smith'
的字符串项。但是,我不想让用户输入像逗号分隔符等丑陋的东西。
方法2 - 使用while
循环break
,要求用户输入每个列表项:
input_list = []
while True:
item = eval(raw_input('Enter new list item (or <Enter> to quit): '))
if item:
input_list.append(item)
else:
break
同样,这使用了我认为应该避免的eval()
。同时按 Enter 来打破抛出EOF解析错误,我猜测是因为eval()
无法对其进行评估。
有更好的方法吗?
答案 0 :(得分:2)
方法二明显优越,但需要稍微调整以避免您看到的错误:
from ast import literal_eval
def get_input_list():
input_list = []
while True:
item = raw_input('Enter new list item (or <Enter> to quit): ')
if not item:
break
input_list.append(literal_eval(item))
return input_list
请注意,输入仅在已知为非空时进行评估,并使用ast.literal_eval
,这比[{1}}更安全,尽管更多有限:
提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和
eval
。
使用中:
None
您还可以添加错误处理,以防用户输入格式错误的字符串或无法评估的内容(例如>>> get_input_list()
Enter new list item (or <Enter> to quit): 24
Enter new list item (or <Enter> to quit): 190.45
Enter new list item (or <Enter> to quit): 'steve'
Enter new list item (or <Enter> to quit):
[24, 190.45, 'steve']
或'foo
):
bar