gpt4 book ai didi

python - 具有嵌套和属性查找的字典?

转载 作者:行者123 更新时间:2023-12-04 11:43:49 27 4
gpt4 key购买 nike

我正在寻找一个类似命名空间的对象,它在获取和设置项目时的行为类似于 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'
如何使示例类安全(删除 evalexec )同时仍然至少允许嵌套查找和属性访问?

最佳答案

您正在寻找 object类,默认情况下它允许更改 class.__dict__.运算符(operator)。如果您还想要 eval像功能一样,您始终可以编写自己的实现。
请注意,这适用于其他内置函数和库,但您需要检查您所做的更改是否与默认值冲突。

class Name_Space(object):

def __getattribute__(self, name):
if '_even' in name:
ret = object.__getattribute__(
self, name.replace('_even', '')
)
if ret % 2:
return False
else:
return True

if '_len' in name:
return len(object.__getattribute__(
self, name.replace('_len', '')
))

return object.__getattribute__(self, name)


if __name__ == '__main__':
ns = Name_Space()

ns.num = 3
print(ns.num_even)

ns.a, ns.b, ns.c = 'ABC'
print(ns.a)

ns.text = 'ZXC'
print(ns.text_len)
print(ns.text.lower())

ns.nested = Name_Space()
ns.nested.arr = [1, 2, 3]
print(ns.nested.arr_len)

关于python - 具有嵌套和属性查找的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68133226/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com