Jestem nowym użytkownikiem Pythona i dekoratorów, więc przepraszam, jeśli wydaje się to być trywialnym pytaniem.Używanie pętli do dekoracji wielu importowanych funkcji w Pythonie
Próbuję zastosować dekoratorów do wielu importowanych funkcji za pomocą pętli w Pythonie, jak pokazano poniżej
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])
idealnie, spodziewam wyjście być w tej formie:
Before calling random
<random_value>
After calling random
Before calling randint
<random_integer>
After calling randint
Before calling choice
<random_choice>
After calling choice
Ale Otrzymuję tylko wynik funkcji wyboru jako wynik.
<random_choice among 4,5 6>
Dekorator nie została zastosowana do dowolnej funkcji i to również wygląda random() i randint (3,8) połączenia nie są coraz wykonywany.
Chciałbym wiedzieć, co tu jest nie tak i co można zrobić, aby ozdobić wiele zaimportowanych funkcji za pomocą pętli?
Dzięki za pomoc
Ale faktycznie zmienia funkcje w module losowej zmienia również innych bibliotek, które dzieją się w użyciu ten moduł, który może być niebezpieczny. Globals() jest niezwykły i jest oznaką robienia rzeczy, które prawdopodobnie nie są potrzebne, ale nie jest szczególnie niebezpieczne. – RemcoGerlich
O ile mi wiadomo, nie zmienia to funkcji * globalnie *: ustawia się tylko różne funkcje dla bieżącego pliku. –
@WillemVanOnsem: tak, ale twoje rozwiązanie faktycznie zmienia funkcje w module losowym, inny kod też to zobaczy. – RemcoGerlich