📌  相关文章
📜  在python中将字符串转换为对象(1)

📅  最后修改于: 2023-12-03 15:23:26.751000             🧑  作者: Mango

在Python中将字符串转换为对象

在Python中,可以使用内置的一些函数将字符串转换为对象。这些函数包括eval()ast.literal_eval()json.loads()等。在下面的介绍中,我们将逐一介绍这些函数及其使用方法。

eval()

eval()是一个内置函数,它可以将字符串解析为Python表达式,并返回表达式的值。

语法
eval(expression, globals=None, locals=None)
参数说明
  • expression: 将要计算的表达式。这个参数必须是一个字符串,可以是任何表达式形式,如数字、字符串、元组、列表、字典等。
  • globals(可选): 包含全局变量的字典。如果提供了globalslocals参数,则会首先在locals中查找变量,如果找不到则会在globals中查找变量。
  • locals(可选): 包含局部变量的字典。
示例
x = 1
print(eval("x + 1"))  # 输出 2

my_dict = {"a": 1, "b": 2}
print(eval("a + b", my_dict))  # 输出 3

需要注意的点:

  • 在使用eval()时,必须确保表达式的来源是可信的,否则可能会造成安全问题。
  • 对于一些复杂的表达式,可能会抛出NameErrorSyntaxError等异常。
ast.literal_eval()

ast.literal_eval()是一个安全的函数,它可以将字符串解析为Python的字面值,并返回对应的对象。

语法
ast.literal_eval(node_or_string)
参数说明
  • node_or_string: 将要计算的字符串或者AST节点。
示例
import ast

my_tuple_str = "(1, 2, 'a', 'b')"
my_tuple = ast.literal_eval(my_tuple_str)
print(my_tuple)  # 输出 (1, 2, 'a', 'b')

my_dict_str = "{1: 'a', 2: 'b'}"
my_dict = ast.literal_eval(my_dict_str)
print(my_dict)  # 输出 {1: 'a', 2: 'b'}

需要注意的点:

  • ast.literal_eval()只能用于字符串字面值,如果在字符串中出现了变量或者表达式等,会抛出ValueError异常。
  • ast.literal_eval()eval()更安全,因为它只能解析字符串字面值,不会执行任意代码。
json.loads()

json.loads()是一个用于解析JSON字符串并返回对应Python对象的函数。

语法
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
参数说明
  • s: 要解析的JSON字符串。
  • cls(可选): 用于与解析后的JSON对象进行交互的可选解码器。如果提供了cls,则会调用该类的decode()方法,将解析后的JSON对象与解码器进行交互。
  • object_hook(可选): 如果提供了object_hook,则解析器在解析对象时会调用这个函数,生成自定义的对象。
  • parse_float(可选): 如果提供了parse_float,则解析器在解析JSON字符串中出现的浮点数时会调用这个函数,将其转换为自定义的浮点数。
  • parse_int(可选): 如果提供了parse_int,则解析器在解析JSON字符串中出现的整数时会调用这个函数,将其转换为自定义的整数。
  • parse_constant(可选): 如果提供了parse_constant,则解析器在解析JSON字符串中出现的特殊值(如nulltruefalse)时会调用这个函数,将其转换为自定义的值。
  • object_pairs_hook(可选): 如果提供了object_pairs_hook,则解析器在解析对象时会调用这个函数,把每一对键值对作为元组传入这个函数,生成自定义的对象。
示例
import json

my_json_str = '{"name": "Alice", "age": 20}'
my_dict = json.loads(my_json_str)
print(my_dict)  # 输出 {'name': 'Alice', 'age': 20}

需要注意的点:

  • json.loads()只能用于解析JSON字符串,因此在解析非JSON字符串时可能会抛出异常。