让用户将不同类型的项目输入列表的最佳方法

时间:2015-02-09 16:51:53

标签: python list user-input

Python中提示用户将项目输入空列表并确保评估条目以纠正数据类型的最佳方法是什么?

例如,用户输入以下intfloatstrlist项值组合:

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()无法对其进行评估。

有更好的方法吗?

1 个答案:

答案 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