Python中字符串转换到对象

在 Python 中,literal_eval 是 ast(抽象语法树)模块提供的一个函数,用于安全地求值包含 Python 字面量或容器显示的字符串。
它将字符串解析为一个 Python 字面量(如 list、dicts、tuples 等)。
literal_eval 的主要目的是为 eval 提供一个更安全的替代方案,因为 eval 会执行任意代码并带来安全风险。

原理:

1、literal_eval() 将字符串或代表 Python 字面量的 AST 节点作为输入。
2、它对字符串进行求值并返回相应的 Python 对象。
3、它只允许安全求值,即只允许基本数据类型,如

  • 数字(整数、浮点数、复数)
  • 字符串(带引号)
  • 布尔值(真、假)
  • 元组、列表和字典(使用有效语法)

4、如果字符串包含任何无效语法或潜在的不安全元素(如函数、导入或类定义),则会引发 ValueError。

from ast import literal_eval

# 评估一个简单的字符串字面量
expression = "1 + 2 * 3"
result = literal_eval(expression)
print(result)  # Output: 7

# 用列表字面量评估字符串
data =
"[1, 2, 'apple', True]"
result = literal_eval(data)
print(result)  # Output: [1, 2, 'apple', True]

代码2:

from ast import literal_eval

# 包含 Python 字面量(此处为列表)的示例字符串
literal_string = "[1, 2, 3, 4, 5]"

try:
    # 安全地评估字面字符串
    result = literal_eval(literal_string)

    # Print the result
    print(
"Result:", result)

    检查结果类型
    print(
"Type:", type(result))
except (SyntaxError, ValueError) as e:
    # Handle potential syntax errors or value errors
    print(f
"Error: {e}")

在本例中,literal_eval 用于安全地评估字符串"[1, 2, 3, 4, 5]",它代表一个列表。如果字符串代表一个有效的 Python 字面量或容器显示,它将返回相应的 Python 对象。如果出现语法错误或字符串不代表有效的字面量,则会引发语法错误或值错误。

它非常适合使用 Python 文件作为数据而不是 JSON。您可以使用 print.pformat() 保存格式化的字面量,然后使用 literal_eval() 加载。受益于 Python 的许多优点,如以 ints 和元组作为键,并能处理集合。

需要记住的重要事项

  • literal_eval 专为字面字符串而设计。不要用它来评估从不可信来源接收的任意代码。
  • 它只能评估基本数据类型。对于类或函数等更复杂的对象,你需要使用不同的方法。
  • 如果需要更大的灵活性,但又了解其中潜在的安全风险,可以考虑使用 ast.parse 和 eval。