Комментарии 1
Как мне кажется, подменять функцию в globals как раз идеологически неверно. Лучше бы саму do_something обернуть в декоратор.
Простой вариант
Если нет возможности во время объявления do_something указывать список таких функций (например мы хотим сделать что-то похожее на плагины), то я завел бы общий реестр, в котором по какому-то ключу можно задавать список таких override'ов
Ваш вариант подходит больше для monkey patching'a, когда надо изменить что-то в логике работы библиотеки, но мы не хотим править ее исходный код. Но тогда кажется подход с globals() не сработает. То есть в разных местах может быть как пропатченная версия, так и оригинальная.
Простой вариант
@implemented_by(do_mod2_something, lambda: not p % 2)
@implemented_by(do_mod3_something, lambda: not p % 3)
def do_something(p):
return p
Если нет возможности во время объявления do_something указывать список таких функций (например мы хотим сделать что-то похожее на плагины), то я завел бы общий реестр, в котором по какому-то ключу можно задавать список таких override'ов
Например
@implemented_by('check_mod')
def do_something(p):
return p
@implements('check_mod', lambda: not p % 2)
def do_mod2_something(p):
return p / 2
@implements('check_mod', lambda: not p % 3)
def do_mod3_something(p):
return p / 3
Ваш вариант подходит больше для monkey patching'a, когда надо изменить что-то в логике работы библиотеки, но мы не хотим править ее исходный код. Но тогда кажется подход с globals() не сработает. То есть в разных местах может быть как пропатченная версия, так и оригинальная.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Псевдопрактический пример замыканий и декораторов