Wpis z mikrobloga

Czy dobrze rozumiem kolejność wykonywania funkcji z dekoratrorem?

1. program natrafia na welcome('Marek') i idzie do tej funkcji
2. przy def welcome(name) jest dekorator, więc wykonuje się funkcja deko(welcome)
3. deco(welcome) zwraca niewywołany wrapper do pierwotnego wywołania welcome('Marek')
4. welcome('Marek') zamienia się (?) na wrapper('Marek') i drukuje się func(name.upper())

Ma to sens?

def deco(func):
....def wrapper(name):
........func(name.upper())
....return wrapper

@deco_
def welcome(name):
....print('Hello,', name)

welcome('Marek')
#python #naukaprogramowania
  • 5
@Rajtuz: dekoratory "wykonują się" podczas "import time"
jeśli zapisałbyś sobie ten kod w pliku dekorator.py i dodał printa przed def wrapper:

def deco(func):
....print("deco called")
....def wrapper(name):
........func(name.upper())
....return wrapper

@deco
def welcome(name):
....print("hello", name)

i w replu zaimportujesz ten plik dekorator.py a następnie wykonasz welcome("Marek") :

>> from dekorator import *

deco called

>> welcome("Marek")

hello MAREK

>>


czyli wykonało się coś takiego: welcome = deco(welcome) i od tego momentu
dekoratory "wykonują się" podczas "import time"


@hyzya17nwf: bzdura. nie wiem co to jest ten "import time" bo spotykam sie z takim okresleniem pierwszy raz, ale dekorator wykonuje sie w momencie jego wywolania a nie w momencie importu. Sek w tym ze moment jego wywolania nie nastepuje w momencie wywolania dekorowanej funkcji / metody / klasy tylko w momencie dekorowania funkcji / metody / klasy. np.:

from dekorator import deco
def main():
w sumie ten fragment:

deco(welcome)("Marek")
nie jest dokladnym przelozeniem uzycia aliasu. dokladnie wyglada to tak:

welcome = deco(welcome)
wiec doskonale widac skad sie wzielo "wywolanie podczas import time" - po prostu wywolujemy funkcje dekorujaca w tym konkretnym miejscu kodu. a potem juz dokladnie w ten sam sposob jak w przypadku uzycia aliasu (@) mozesz wywolac funkcje welcome:

welcome("Marek")
@Rajtuz: a sorry, tobie nie odpisalem - ale tak. jest to PRAWIE dokladnie tak jak napisales. poza punktem 3 gdzie dekorator redeklaruje funkcje welcome i przypisuje jej funkcje deco..wrapper w ktorej atrybut func ma wartosc oryginalnej funkcji welcome (czyli jakies callable).
@hyzya17nwf: @vogello:

Dzięki za pomoc. Dopiero teraz uświadomiliście mi, że samo użycie @deco wystarczy do wywołania funkcji dekorującej i zwrócenia nieaktywnego wrappera, a funkcja którą się dekoruje nie musi być nawet uruchomiona (°°