具有嵌套和属性查找的字典?
我正在寻找一个类似命名空间的对象,它在获取和设置项目时的行为类似于 Python 评估上下文,大致相当于以下不安全示例:
from collections import UserDict
class UnsafeNamespaceDict(UserDict):
def __getitem__(self, var):
return eval(var, {}, self.data)
def __setitem__(self, var, val):
return exec(f'{var} = val', {'val': val}, self.data)
您可以通过访问嵌套数据或属性的查找来查看预期行为:
>>> nd = UnsafeNamespaceDict()
>>> nd['x'] = 'abc'
>>> nd['x[1]']
'b'
>>> nd['x.count']
<built-in method count of str object>
>>> nd['x[1].count']
<built-in method count of str object>
设置不存在的项目以自然的方式失败:
>>> nd['y.z'] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __setitem__
File "<string>", line 1, in <module>
NameError: name 'y' is not defined
元组拼接工作:
>>> nd['a, b, c'] = 'ABC'
>>> nd['c']
'C'
如何使示例类安全(删除eval和exec),同时仍至少允许嵌套查找和属性访问?