Как стать автором
Обновить

Комментарии 1

Как мне кажется, подменять функцию в globals как раз идеологически неверно. Лучше бы саму do_something обернуть в декоратор.

Простой вариант

@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() не сработает. То есть в разных местах может быть как пропатченная версия, так и оригинальная.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории