📅  最后修改于: 2023-12-03 15:23:26.751000             🧑  作者: Mango
在Python中,可以使用内置的一些函数将字符串转换为对象。这些函数包括eval()
、ast.literal_eval()
和json.loads()
等。在下面的介绍中,我们将逐一介绍这些函数及其使用方法。
eval()
是一个内置函数,它可以将字符串解析为Python表达式,并返回表达式的值。
eval(expression, globals=None, locals=None)
expression
: 将要计算的表达式。这个参数必须是一个字符串,可以是任何表达式形式,如数字、字符串、元组、列表、字典等。globals
(可选): 包含全局变量的字典。如果提供了globals
和locals
参数,则会首先在locals
中查找变量,如果找不到则会在globals
中查找变量。locals
(可选): 包含局部变量的字典。x = 1
print(eval("x + 1")) # 输出 2
my_dict = {"a": 1, "b": 2}
print(eval("a + b", my_dict)) # 输出 3
需要注意的点:
eval()
时,必须确保表达式的来源是可信的,否则可能会造成安全问题。NameError
、SyntaxError
等异常。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字符串并返回对应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字符串中出现的特殊值(如null
、true
、false
)时会调用这个函数,将其转换为自定义的值。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字符串时可能会抛出异常。