Я новичок в Python и декораторах, поэтому извиняюсь, если это кажется тривиальным вопросом.Использование циклов для украшения нескольких импортированных функций в Python
Я пытаюсь применить декоратор к нескольким импортируемым функциям, используя цикл в Python, как показано ниже
from random import random, randint, choice
def our_decorator(func):
def function_wrapper(*args, **kwargs):
print("Before calling " + func.__name__)
res = func(*args, **kwargs)
print(res)
print("After calling " + func.__name__)
return function_wrapper
for f in [random, randint, choice]:
f = our_decorator(f)
random()
randint(3, 8)
choice([4, 5, 6])
В идеале, я ожидаю, что выход будет в таком виде:
Before calling random
<random_value>
After calling random
Before calling randint
<random_integer>
After calling randint
Before calling choice
<random_choice>
After calling choice
Но, Я получаю результат функции выбора как результат.
<random_choice among 4,5 6>
декоратор не был применен к любой из функций, и это также выглядит как случайная() и randint (3,8) звонки не получают казнены.
Я хотел бы знать, что здесь не так, и что можно сделать, чтобы украсить несколько импортированных функций с помощью циклов?
Спасибо за помощь
Но на самом деле изменения функции в случайном модуле также изменяет другие библиотеки, которые происходят использовать этот модуль, который может быть опасным. Globals() необычен и является признаком того, что делает вещи, которые, вероятно, не нужны, но это не особенно опасно. – RemcoGerlich
Насколько я знаю, это не изменяет функцию * глобально *: вы устанавливаете только разные функции для текущего файла. –
@WillemVanOnsem: да, но это решение фактически меняет функции в случайном модуле, другой код тоже это увидит. – RemcoGerlich