Sea*_*123 1 python dictionary immutability data-structures python-3.x
与之前的问题类似,我想创建一个冻结/不可变的字典。具体来说,初始化后,用户ValueError在尝试使用__delitem__和__setitem__方法时应该得到一个 。
与前面的问题不同,我特别希望它成为一个子类,其中初始化类型仅限于特定的键和值类型。
我自己尝试完成此任务collections.UserDict失败了:
class WorkflowParams(UserDict):
def __init__(self, __dict: Mapping[str, str]) -> None:
super().__init__(__dict=__dict)
def __setitem__(self, key: str, item: str) -> None:
raise AttributeError("WorkflowParams is immutable.")
def __delitem__(self, key: str) -> None:
raise AttributeError("WorkflowParams is immutable.")
Run Code Online (Sandbox Code Playgroud)
当尝试使用它时:
workflow_parameters = WorkflowParams(
{
"s3-bucket": "my-big-bucket",
"input-val": "1",
}
)
Run Code Online (Sandbox Code Playgroud)
它失败了
Traceback (most recent call last):
File "examples/python_step/python_step.py", line 38, in <module>
workflow_parameters = WorkflowParams(
File "/home/sean/git/scargo/scargo/core.py", line 14, in __init__
super().__init__(__dict=__dict)
File "/home/sean/miniconda3/envs/scargo/lib/python3.8/collections/__init__.py", line 1001, in __init__
self.update(kwargs)
File "/home/sean/miniconda3/envs/scargo/lib/python3.8/_collections_abc.py", line 832, in update
self[key] = other[key]
File "/home/sean/git/scargo/scargo/core.py", line 17, in __setitem__
raise AttributeError("WorkflowParams is immutable.")
AttributeError: WorkflowParams is immutable.
Run Code Online (Sandbox Code Playgroud)
由于我需要一个子类,通常建议的 using 解决方案MappingProxyType不能满足我的要求。
这似乎对我来说效果很好(用 Python 3.6 和 3.8 测试):
from collections import UserDict
from typing import Mapping
class WorkflowParams(UserDict):
def __init__(self, __dict: Mapping[str, str]) -> None:
super().__init__()
for key, value in __dict.items():
super().__setitem__(key, value)
def __setitem__(self, key: str, item: str) -> None:
raise AttributeError("WorkflowParams is immutable.")
def __delitem__(self, key: str) -> None:
raise AttributeError("WorkflowParams is immutable.")
workflow_parameters = WorkflowParams(
{
"s3-bucket": "my-big-bucket",
"input-val": "1",
}
)
print(workflow_parameters)
# output: {'s3-bucket': 'my-big-bucket', 'input-val': '1'}
workflow_parameters['test'] = 'dummy'
# expected exception: AttributeError: WorkflowParams is immutable.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1152 次 |
| 最近记录: |