如何限制字典中的值范围?

时间:2019-01-26 11:31:26

标签: python variables syntax

我想对字典中的值施加限制。 例如,假设我有以下字典

speed = {
    'x': 8,
    'y': 0,
    'z': 4}

我希望速度字典中与x键对应的值始终小于10。 例如,如果我将其用于某些功能

    calcuate_speed(speed)

或 如果我进行一些数学变换

    speed["x"] += 1 

该值不应大于我定义的某个限制。 最简单的处理方法是什么?

3 个答案:

答案 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