python - 在 Python 中定义类型化字典
问题描述
我正在尝试在 Python 中定义一个类型化的字典。我已经编写了以下代码段,但我想知道是否有更好的方法来实现相同的目标。我正在使用,但如果您愿意defaultdict
,可以随意将其更改为基础。dict
from collections import defaultdict
class typed_dict(defaultdict):
def __init__(self, key_type, val_type, *args, **kwargs):
self.key_type = key_type
if type(val_type) == type(lambda: 1):
self.val_type = type(val_type())
else:
self.val_type = val_type
super(typed_dict, self).__init__(val_type, *args, **kwargs)
def __getitem__(self, k):
try:
assert type(k) == self.key_type
return super(typed_dict, self).__getitem__(k)
except AssertionError:
print('key mismatch, got {}, must be {}'.format(type(k), self.key_type))
def __setitem__(self, k, v):
try:
assert type(k) == self.key_type
assert type(v) == self.val_type
super(typed_dict, self).__setitem__(k, v)
except AssertionError:
print('key or value mismatch, got {}: {}, \
must be {}: {}'.format(type(k), type(v), self.key_type, self.val_type))
d = typed_dict(int, str)
d[1]
d[2] = "two"
d["one"]
d["three"] = 3
d[3] = 3
print(d)
d = typed_dict(int, lambda: '')
d[1]
d[2] = "two"
d["one"]
d["three"] = 3
d[3] = 3
print(d)
import numpy as np
d = typed_dict(int, lambda: np.zeros(2))
d[1]
d[2] = "two"
d[3] = np.array([1,2,3])
print(d)
解决方案
推荐阅读
- css - SVG 填充路径动画
- sql - 是否有关于 SQL 函数是否应大写的“官方”约定?
- python - 十六进制转字符并逐字打印
- elixir - 使用 Ecto 选择、选择合并和连接
- matplotlib - 是否可以在 matplotlib 图例条目中使用文本作为句柄?
- go - 如何在 Go 中获取指向 Interface{} 底层值的指针
- c# - 如何在 ASP.NET WebAPI 中诊断格式错误的 JObject?
- android - “URI 未注册(设置 | 语言和框架 | 模式和 DTD)”&“属性工具:此处不允许使用上下文”
- r - 如何根据其他数据框中的两个条件创建列?
- php - 如何使用 Eloquent 通过外键值从数据库中获取所有行?