将字符串内的表达式计算为字典(Python)

将字符串内的表达式计算为字典(Python),python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我正在尝试读取包含Python表达式的字符串,并尝试使用ast.literal\u eval对其求值。 预期结果应为dict。相反,我得到了str。 我做错了什么 test.txt 功能 输出 因为代码用引号括起来 您需要将提示符和命令用引号括起来,而不是整行。好的,请查看您在输入周围用引号括起来的那些引号?关于修复部分:字典不是有序集合。没错,字典不是有序结构。如果您确定eval_literal没有进行任何排序,我将删除它以避免混淆人们。它很有效。这意味着键应该始终是字符串。eval应该自己做

我正在尝试读取包含Python表达式的字符串,并尝试使用
ast.literal\u eval
对其求值。 预期结果应为
dict
。相反,我得到了
str
。 我做错了什么

test.txt 功能 输出
因为代码用引号括起来


您需要将
提示符
命令
用引号括起来,而不是整行。

好的,请查看您在输入周围用引号括起来的那些引号?关于
修复
部分:字典不是有序集合。没错,字典不是有序结构。如果您确定
eval_literal
没有进行任何排序,我将删除它以避免混淆人们。它很有效。这意味着键应该始终是字符串。
eval
应该自己做吗?@flamenco,不
eval
不应该。如果可能,不要使用
eval
。它可以执行任意表达式。字符串中的表达式还有其他可用的计算方法吗?你会怎么做?@flamenco
eval
足够聪明,不会这么做。因为对字符串的引用是合法的键值,所以没有理由假定
prompt
应该是文本字符串,除非您自己引用它。
{prompt : 'prompt1> ' , command : 'cmd1'}
{prompt : 'prompt2> ' , command : 'cmd2'}
{prompt : 'prompt3> ' , command : 'cmd3'}
{prompt : 'prompt4> ' , command : 'cmd4'}
def send_commands(commands):
    with open(commands, 'r') as file:
        current_line = ast.literal_eval('"' + next(file).rstrip("\n") + '"')
        for next_line in file:
            next_line = ast.literal_eval('"' + next_line.rstrip("\n") + '"')
            print(current_line)
            print(next_line)
            print("type:", type(current_line), type(next_line))
            current_line = next_line

import ast
commands     = "test.txt"
send_commands(commands)
{prompt : 'prompt1> ' , command : 'cmd1'}
{prompt : 'prompt2> ' , command : 'cmd2'}
type: <class 'str'> <class 'str'>
{prompt : 'prompt2> ' , command : 'cmd2'}
{prompt : 'prompt3> ' , command : 'cmd3'}
type: <class 'str'> <class 'str'>
{prompt : 'prompt3> ' , command : 'cmd3'}
{prompt : 'prompt4> ' , command : 'cmd4'}
type: <class 'str'> <class 'str'>
{'command': 'cmd1', 'prompt': 'prompt1> '}
{'command': 'cmd2', 'prompt': 'prompt2> '}
type: <class 'dict'> <class 'dict'>
{'command': 'cmd2', 'prompt': 'prompt2> '}
{'command': 'cmd3', 'prompt': 'prompt3> '}
type: <class 'dict'> <class 'dict'>
{'command': 'cmd3', 'prompt': 'prompt3> '}
{'command': 'cmd4', 'prompt': 'prompt4> '}
type: <class 'dict'> <class 'dict'>