kolumbou
@kolumbou
python, html, c#

Как правильно организовать функцию?

Доброго времени суток.

Есть один словарь такого вида:

payload = {
    'jo': '1',
    'ta':'2',
    'bo':'3',  }


Как его правильно завернуть в функцию (и возможно ли?), что бы в последствии обращаясь к функции можно было менять значения в этом словаре? ( ex. payloadfunc(jo=2,ta=4) )
  • Вопрос задан
  • 216 просмотров
Решения вопроса 1
Можно вместо словаря сделать эту структуру классом.

class Payload(object):
    jo = 1
    ta = 2
    bo = 3

    def set_properties(self, **kwargs):
        for k, v in kwargs.viewitems():
            setattr(self, k, v)


# можно использовать синглтон
payload = Payload()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Комментировать
class ClassPropertyDescriptor(object):

    def __init__(self, fget, fset=None):
        self.fget = fget
        self.fset = fset

    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        return self.fget.__get__(obj, klass)()

    def __set__(self, obj, value):
        if not self.fset:
            raise AttributeError("can't set attribute")
        type_ = type(obj)
        return self.fset.__get__(obj, type_)(value)

    def setter(self, func):
        if not isinstance(func, (classmethod, staticmethod)):
            func = classmethod(func)
        self.fset = func
        return self    

def classproperty(func):
    if not isinstance(func, (classmethod, staticmethod)):
        func = classmethod(func)

    return ClassPropertyDescriptor(func)


class Bar(object):

    _bar = 1

    @classproperty
    def bar(cls):
        return cls._bar

    @bar.setter
    def bar(cls, value):
        cls._bar = value


# test instance instantiation
foo = Bar()
assert foo.bar == 1

baz = Bar()
assert baz.bar == 1

# test static variable
baz.bar = 5
assert foo.bar == 5

# test setting variable on the class
Bar.bar = 50
assert baz.bar == 50
assert foo.bar == 50
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы