1. 程式人生 > 其它 >python基礎面試題之型別轉換(字典篇)

python基礎面試題之型別轉換(字典篇)

問 如何將一個字典字串轉換成字典;

user_info='{"name" : "rianley", "gender" : "male", "age": 18}'

最簡單的方式;用json轉換一下唄;程式碼如下;

>>> import json
>>> user_info= '{"name" : "rianley", "gender" : "male", "age": 18}'
>>> user_dict = json.loads(user_info)

但是使用json進行轉換存在一個潛在的問題。

由於json語法規定陣列或物件之中的字串必須使用雙引號,不能使用單引號

(官網上有一段描述是 “A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes” ),因此下面的轉換是錯誤的:

就是 類似於下面的dict字串轉換是會出現錯誤的

user_info="{'name' : 'rianley', 'gender' : 'male', 'age': 18}"

通過 eval

>>> user_info = '{"name" : "rianley", "gender" : "male", "age": 18}
' >>> user_dict = eval(user_info) >>> user_dict {'gender': 'male', 'age': 18, 'name': 'rianley'} >>> user_info = "{'name' : 'rianley', 'gender' : 'male', 'age': 18}" >>> user_dict = eval(user_info) >>> user_dict {'gender': 'male', 'age': 18, 'name': 'rianley
'}

通過eval進行轉換就不存在上面使用json進行轉換的問題。但是,使用eval卻存在安全性的問題,比如下面的例子:

# 讓使用者輸入 `user_info`
>>> user_info = raw_input('input user info: ')
# 輸入 {"name" : "john", "gender" : "male", "age": 28},沒問題
>>> user_dict = eval(user_info)
# 輸入 __import__('os').system('dir'),user_dict 會列出當前的目錄檔案!
# 再輸入一些刪除命令,則可以把整個目錄清空了!
>>> user_dict = eval(user_info)

通過 ast庫中的literal_eval函式

>>> import ast
>>> user = '{"name" : "rianley", "gender" : "male", "age": 18}'
>>> user_dict = ast.literal_eval(user)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
user_info = "{'name' : 'rianley', 'gender' : 'male', 'age': 18}"
>>> user_dict = ast.literal_eval(user)
>>> user_dict
{'gender': 'male', 'age': 18, 'name': 'rianley'}

  

使用ast.literal_eval進行轉換既不存在使用json進行轉換的問題,也不存在使用eval進行轉換的安全性問題,因此推薦使用ast.literal_eval

每天記錄一個小知識.....