Существуют области, особенно в «функциях, вызывающих функции функций», где объекты позволяют меньше вложенности.
Рассмотрите возможность создания классического декоратора, который проверяет уровень авторизации перед вызовом функции. С помощью понятно:
@check_authorization(level="Manager")
def update_price(Item, new_price):...
Вы можете сделать это как вложенные функции:
def check_authorization(level):
def take_params(function):
def concrete(*args, **kwargs):
if user_level_greater_than(level):
return function(*args,
**kwargs)
return None
return concrete
return take_params
Или вы можете сделать это как класс, что может быть понятнее:
class check_authorization(object):
def __init__(level):
self.level = level
def __call__(function):
self.function = function
return self.dec
def dec(self, *args, **kwargs):
if user_level_greater_than(self.level):
return self.function(*args,v**kwargs)
return None
Многие сочтут этот плоский метод более понятным. Конечно, я верю в обман, потому что мне нравятся правильные подписи и метаданные:
from dectools.dectools import make_call_if
@make_call_if
def check_authorization(function, arg, kwargs, level):
return user_level_greater_than(level)
Вызываемый объект - это инструмент, который подходит для некоторых известных приложений, а также может быть полезен для странной проблемы, которую бросает вам реальная жизнь.