我想对字典中的值施加限制。 例如,假设我有以下字典
speed = {
'x': 8,
'y': 0,
'z': 4}
我希望速度字典中与x键对应的值始终小于10。 例如,如果我将其用于某些功能
calcuate_speed(speed)
或 如果我进行一些数学变换
speed["x"] += 1
该值不应大于我定义的某个限制。 最简单的处理方法是什么?
答案 0 :(得分:2)
您可以通过以下方式进行操作:
from collections import UserDict
class MyDict(UserDict):
def __setitem__(self, key, value):
if value > 10: # any validation
raise ValueError('Too big!')
super().__setitem__(key, value)
但是最好将类与property
一起使用。
完整版本:
from collections import UserDict
from math import sqrt
class VectorDict(UserDict):
def __init__(self, *args, speed_limit, **kwargs):
self.speed_limit = speed_limit
super().__init__(*args, **kwargs)
def __setitem__(self, key, value):
if self._calc_speed(key, value) > self.speed_limit:
raise ValueError('Too big!')
super().__setitem__(key, value)
def _calc_speed(self, replace_key=None, replace_value=0):
square_sum = 0
for key, value in self.items():
if key == replace_key:
value = replace_value
square_sum += value ** 2
return sqrt(square_sum)
@property
def speed(self):
return self._calc_speed()
example_1d = VectorDict(x=1, speed_limit=5)
example_2d = VectorDict(x=1, y=5, speed_limit=7)
example_3d = VectorDict(x=1, y=5, z=3, speed_limit=13)
print(example_3d.speed)
example_3d['x'] += 10 # ValueError: Too big!
答案 1 :(得分:1)
只需在您的周期中添加一些价值控制即可。 例如:
if (speed['x'] >= 10):
speed['x'] = 9
答案 2 :(得分:1)
用属性MyClass
定义类speed
:
class MyClass:
def __init__(self):
self.speed = 0
def __setattr__(self, k, v):
if k == 'speed' and v > 10:
return
self.__dict__[k] = v
在这里,我只是忽略对speed
的任何更改(如果它不是有效值),但是您可以根据自己的需要以不同的方式处理它(例如引发异常)
这是一个演示:
m = MyClass()
m.speed = 8
print(m.speed)
m.speed += 1
print(m.speed)
m.speed += 1
print(m.speed)
m.speed += 1
print(m.speed)
我们得到以下输出:
8
9
10
10