Избавление от магических чисел в обработчике ошибок BoundedNumericProperty - PullRequest
0 голосов
/ 13 июня 2019

Я новичок в использовании BoundedNumericProperty.Мне нужно ограничить значение переменной, скажем, с именем «насыщенность», от 0 до 1, чтобы, если я попытаюсь установить значение больше 1, я получу 1, если меньше 0, то 0.

Я узнал, что это можно сделать так:

saturation = BoundedNumericProperty (
                            0.1,
                            min = 0,
                            max = 1.,
                            errorhandler = lambda x: min (max (x, 0), 1))

Этот код работает правильно, но он недостаточно удобен из-за обработчика ошибок.

Как видите, проблема в том,что у меня есть ненужные магические числа в обработчике ошибок (0 и 1), которые дублируют значения аргументов min и max.

Я рассмотрел различные примеры использования BoundedNumericProperty на Github, и я вижу это почти во всех примерах.

Вместо этого я хотел бы просто написать что-то вроде:

saturation = MyProperty (
                            0.1,
                            min = 0,
                            max = 1.,)

, и я бы хотел, чтобы это свойство работало следующим образом:

class MyProperty(BoundedNumericProperty): 
    def __init__(*args, min=0, max=1, **kwargs):
         super().__init__(*args, min=min, max=max, errorhandler=lambda x: min(max(x, min), max), **kwargs)

Но здесь я получаю

super().__init__(*args, min=min, max=max, errorhandler=lambda x: min(max(x, min), max), **kwargs)
 RuntimeError: super(): no arguments

(python3)

Как это реализовать?

1 Ответ

0 голосов
/ 13 июня 2019

Это похоже на работу

class MyProperty(BoundedNumericProperty):
    def __init__(self, *largs, **kw):
        my_min = kw.get('min', 0)  # 0 is default
        my_max = kw.get('max', 1)  # 1 is default
        kw['min'] = my_min
        kw['max'] = my_max
        kw['errorhandler'] = lambda x: min(max(x, my_min), my_max)
        super().__init__(*largs, **kw)

другой пример (без использования лямбды):

class MyProperty(BoundedNumericProperty):
    def __init__(self, *largs, **kw):
        self._my_min = kw.get('min', 0)  # 0 is default
        self._my_max = kw.get('max', 1)  # 1 is default
        kw['min'] = self._my_min
        kw['max'] = self._my_max
        kw['errorhandler'] = self._my_errorhandler
        super().__init__(*largs, **kw)

    def _my_errorhandler(self, x):
        return min(max(x, self._my_min), self._my_max)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...