Domácí úlohu jsem zatím nevyřešil, ale snažím se. Ale mám dotaz. Dekorátor, resp. jeho definici, musím v kódu umístit PŘED definici funkce, kterou chci dekorovat. To samé platí pro volání toho dekorátoru pomocí syntaktického cukru @decorator, to musí být také umístěno TĚSNĚ PŘED definicí funkce, kterou chci dekorovat. Jak ale odekoruji funkci, kterou jsem třeba ani nenapsal já, která je třeba v jiném modulu a já si jí "jenom" importuji???
3 роки тому+1
To definovanie plati pre @ zápis dekorovat vies aj takto (ukazoval som to ako prvú možnosť) funkcia = dekorator(funkcia) a podom vies volat funkcia() To je aj odpoveď na tvoju otázku s importovanou funkciou :)
Dobrý deň , Chcel by som sa Vás opýtať , či neviete mi povedať , prečo vždy keď zapnem nejaký môj kód vo visual studio code mi reaguje len prvý riadok terminálu ? Napríklad napíšem a=str(input(("Ahoj, ako sa máš ? ")) print(a) Output v termináli : Ahoj, ako sa máš? Dobre PS C:\Users\Lucas\Desktop\Python> A vypisuje mi User input inst supported Ďakujem Vám za odpoveď , fakt si s tým neviem dať rady a nechápem , kde nastala chyba , postupoval som len podľa vášho tutoriálu .
3 роки тому
Hm nerozumiem preco sa ro deje … uistite sa ze najprv kod napisete vo vscode potom v subore kliknete pravym a date run file in terminal
Dá sa dekorovať premenná? Príklad ten istý ako máš vo videu funkciu sleeper a dekorátor duration_checker. a = sleeper() , b = sleeper() ale chcem odekorovať iba b
Riešenie extra domácej úlohy: def repeater(num_times): def decorator(func): for repeat in range(num_times): func() return decorator @repeater(num_times=3) def showing_picture(): print("I am showing picture")
def repeat(num_times): def decorator_repeat(func): @functools.wraps(func) def wrapper(*args): for _ in range(num_times): value = func(*args) return value return wrapper return decorator_repeat @repeat(num_times=3) def sleeper(seconds, meno): time.sleep(seconds) print(datetime.datetime.now()) print(f"volam sa {meno}") return meno print(sleeper(1, "fero")) Google mi dost pomohol, ale stale mam otazku. Co v pripade, ze parameter meno bude napr v dictionary,poli atd, kde tych mien bude viacero? Ake by bolo najrozumnejsie riesenie, pri ktorom by pri kazdom zopakovani bola pouzita ina hodnota parametra? Napr opakovanie 1 da meno fero, opakovanie 2 da meno jozo atd. Napada ma vyuzit hodnotu genererovanu v zadanom range(num_times) ako index pre iteraciu parametera. No ak existuje lepsie riesenie ,rad si necham poradit :) Vdaka.
Teď, jak se snažím prokousat těmi dekorátory, tak mě napadá, že možná předtím se měly probrat Python Closures, protože to je asi pochopitelnější a je to takový odrazový můstek, nebo se pletu?
3 роки тому
Closures su zaujimava tema :) Dekoratory mi prisli prijatelnejsie na zaciatok :)
@ no vida, tak jsem asi něco nepochopil v těch uzávěrech, protože mě naopak přišlo, že dekorátory jsou vlastně až důsledek možnosti využití uzávěrů, tudíž logicky že jsou jednodušší. Navíc ten dekorátor s parametrem, tam se mi právě zdálo, že využívá té vlastnosti uzávěru, že vnitřní funkce vidí argumenty z vnější funkce a ty tam navíc "zůstávají viset.
Ahojte, pridávam riešenie domácej úlohy s vysvetlením pre porozumenie: def repeater(rep): #repeater - funkcia ktorá určí, koľko krát sa bude opakovať decorator def decorator(func): #decorator - vonkajšia funkcia, ktorá pracuje s funkciou ako celkom def wrapper(*args): #vnútorná funkcia wrapper, ktorá pracuje s agumentami funkcie for i in range (1,rep+1): #cyklus s nastaveným číslovaním od jednotky print(f"Budem tlacit funkciu po {i} krat") #tlačím, koľká iterácia sa bude tlačiť result = func(*args) #vykonanie funkcie s jej argumentami print(result) #tlačím výsledok return (f'{result} sa zopakoval {rep} krat') #vrátim výsledok a koľkokrát sa zopakoval return wrapper #vrátim wrapper return decorator #vrátim decorator @repeater(3) # v zátvorke je koľkokrát sa zopakuje def show_picture(): return("I am showing picture ") print(show_picture())
Super, vdaka za skvele vysvetlenie a priklady a za mna by som urcite privital aj viac takychto pokrocilejsich videi ked uz sa pytas :) ale pri tom kolko videi v roznych kurzoch si spravil tak mam co dohanat tak ci tak :) Za mna to bola velmi zaujimava tema ale po chvili premyslania pomerne lahko pochopitelna (dufam) :D Ak spravne chapem tak pri definovani dekoratoru je potrebne vopred vediet, ci funcia, ktoru budeme dekorovat bude mat argumenty? *args je super, ale ked som to skusal pouzit na funkciu bez argumentov tak to vyhodilo error - takze predpokladam ze tuto info na ake funkcie sa bude pouzivat treba mat vopred, pri definovani dekoratoru, pripadne zadefinovat 2 podobne dekoratory ak treba a pouzit podla situacie (ci pomocou neho definujeme funkciu s argumentom (-tami) alebo bez... a Pridavam aj moje riesenie dekoratoru pre x opakovani funkcie (o teme si este urcite pozriem viac lebo ma to dost zaujalo ale toto slo na prvu dobru po vypocuti si zadania bez dodatocneho studia dokumentacie / rad na nete: def repeater(func): number = int(input("How many times to call the function?")) def wrapper(): for i in range(number): func() return wrapper @repeater def function_caller(): print("function called")
No tak asi je něco na YT špatně. Pod videem vidím, že jsou tam 4 komentáře napočítané, ale přitom pokud ty komentáře prohlížím, tak vidím jenom dva. Dva další jakoby neexistovaly. Dost možná jsou to ty dva moje, o kterých tvrdím, že se ztratily. A je jedno, jestli se dívám z PC nebo z mobilu. Tak teď vážně nevím. Třeba má YT problém s komentáři ve třetí a vyšší úrovni zanoření, nevím. Asi nebudu už raději dávat Reply na již existující odpověď :-(
Ďakujem za ďalšie zaujímavé video...
Domácí úlohu jsem zatím nevyřešil, ale snažím se. Ale mám dotaz. Dekorátor, resp. jeho definici, musím v kódu umístit PŘED definici funkce, kterou chci dekorovat. To samé platí pro volání toho dekorátoru pomocí syntaktického cukru @decorator, to musí být také umístěno TĚSNĚ PŘED definicí funkce, kterou chci dekorovat. Jak ale odekoruji funkci, kterou jsem třeba ani nenapsal já, která je třeba v jiném modulu a já si jí "jenom" importuji???
To definovanie plati pre @ zápis dekorovat vies aj takto (ukazoval som to ako prvú možnosť)
funkcia = dekorator(funkcia)
a podom vies volat funkcia()
To je aj odpoveď na tvoju otázku s importovanou funkciou :)
Prosím, nemohol by si urobiť video o dynamických premenných vo for cykloch?
def decorators(*args):
def wrapper(func):
multiple = [func() for _ in range(args[0])]
return multiple
return wrapper
#Voolanie funkcie napr 2x:
@decorators(2)
def show_me():
print('Hello world')
Dobrý deň ,
Chcel by som sa Vás opýtať , či neviete mi povedať , prečo vždy keď zapnem nejaký môj kód vo visual studio code mi reaguje len prvý riadok terminálu ? Napríklad napíšem a=str(input(("Ahoj, ako sa máš ? "))
print(a)
Output v termináli : Ahoj, ako sa máš? Dobre
PS C:\Users\Lucas\Desktop\Python>
A vypisuje mi User input inst supported
Ďakujem Vám za odpoveď , fakt si s tým neviem dať rady a nechápem , kde nastala chyba , postupoval som len podľa vášho tutoriálu .
Hm nerozumiem preco sa ro deje … uistite sa ze najprv kod napisete vo vscode potom v subore kliknete pravym a date run file in terminal
Dá sa dekorovať premenná? Príklad ten istý ako máš vo videu funkciu sleeper a dekorátor duration_checker. a = sleeper() , b = sleeper() ale chcem odekorovať iba b
Riešenie extra domácej úlohy:
def repeater(num_times):
def decorator(func):
for repeat in range(num_times):
func()
return decorator
@repeater(num_times=3)
def showing_picture():
print("I am showing picture")
Ahoj. Jakto, že se toto řešení provede? Myslel jsem, že je nutné ještě zavolat fci showing_picture() a až potom se provede 🤔
tento cyklus, sa spustí po definícii dekorátora, nie po volani funkcie ktora je dekorovana
def repeat(num_times):
def decorator_repeat(func):
@functools.wraps(func)
def wrapper(*args):
for _ in range(num_times):
value = func(*args)
return value
return wrapper
return decorator_repeat
@repeat(num_times=3)
def sleeper(seconds, meno):
time.sleep(seconds)
print(datetime.datetime.now())
print(f"volam sa {meno}")
return meno
print(sleeper(1, "fero"))
Google mi dost pomohol, ale stale mam otazku. Co v pripade, ze parameter meno bude napr v dictionary,poli atd, kde tych mien bude viacero? Ake by bolo najrozumnejsie riesenie, pri ktorom by pri kazdom zopakovani bola pouzita ina hodnota parametra? Napr opakovanie 1 da meno fero, opakovanie 2 da meno jozo atd. Napada ma vyuzit hodnotu genererovanu v zadanom range(num_times) ako index pre iteraciu parametera. No ak existuje lepsie riesenie ,rad si necham poradit :) Vdaka.
Teď, jak se snažím prokousat těmi dekorátory, tak mě napadá, že možná předtím se měly probrat Python Closures, protože to je asi pochopitelnější a je to takový odrazový můstek, nebo se pletu?
Closures su zaujimava tema :) Dekoratory mi prisli prijatelnejsie na zaciatok :)
@ no vida, tak jsem asi něco nepochopil v těch uzávěrech, protože mě naopak přišlo, že dekorátory jsou vlastně až důsledek možnosti využití uzávěrů, tudíž logicky že jsou jednodušší. Navíc ten dekorátor s parametrem, tam se mi právě zdálo, že využívá té vlastnosti uzávěru, že vnitřní funkce vidí argumenty z vnější funkce a ty tam navíc "zůstávají viset.
Ahojte, pridávam riešenie domácej úlohy s vysvetlením pre porozumenie:
def repeater(rep): #repeater - funkcia ktorá určí, koľko krát sa bude opakovať decorator
def decorator(func): #decorator - vonkajšia funkcia, ktorá pracuje s funkciou ako celkom
def wrapper(*args): #vnútorná funkcia wrapper, ktorá pracuje s agumentami funkcie
for i in range (1,rep+1): #cyklus s nastaveným číslovaním od jednotky
print(f"Budem tlacit funkciu po {i} krat") #tlačím, koľká iterácia sa bude tlačiť
result = func(*args) #vykonanie funkcie s jej argumentami
print(result) #tlačím výsledok
return (f'{result} sa zopakoval {rep} krat') #vrátim výsledok a koľkokrát sa zopakoval
return wrapper #vrátim wrapper
return decorator #vrátim decorator
@repeater(3) # v zátvorke je koľkokrát sa zopakuje
def show_picture():
return("I am showing picture ")
print(show_picture())
Super, vdaka za skvele vysvetlenie a priklady a za mna by som urcite privital aj viac takychto pokrocilejsich videi ked uz sa pytas :) ale pri tom kolko videi v roznych kurzoch si spravil tak mam co dohanat tak ci tak :)
Za mna to bola velmi zaujimava tema ale po chvili premyslania pomerne lahko pochopitelna (dufam) :D Ak spravne chapem tak pri definovani dekoratoru je potrebne vopred vediet, ci funcia, ktoru budeme dekorovat bude mat argumenty? *args je super, ale ked som to skusal pouzit na funkciu bez argumentov tak to vyhodilo error - takze predpokladam ze tuto info na ake funkcie sa bude pouzivat treba mat vopred, pri definovani dekoratoru, pripadne zadefinovat 2 podobne dekoratory ak treba a pouzit podla situacie (ci pomocou neho definujeme funkciu s argumentom (-tami) alebo bez...
a Pridavam aj moje riesenie dekoratoru pre x opakovani funkcie (o teme si este urcite pozriem viac lebo ma to dost zaujalo ale toto slo na prvu dobru po vypocuti si zadania bez dodatocneho studia dokumentacie / rad na nete:
def repeater(func):
number = int(input("How many times to call the function?"))
def wrapper():
for i in range(number):
func()
return wrapper
@repeater
def function_caller():
print("function called")
No tak asi je něco na YT špatně. Pod videem vidím, že jsou tam 4 komentáře napočítané, ale přitom pokud ty komentáře prohlížím, tak vidím jenom dva. Dva další jakoby neexistovaly. Dost možná jsou to ty dva moje, o kterých tvrdím, že se ztratily. A je jedno, jestli se dívám z PC nebo z mobilu. Tak teď vážně nevím. Třeba má YT problém s komentáři ve třetí a vyšší úrovni zanoření, nevím. Asi nebudu už raději dávat Reply na již existující odpověď :-(
Z tejto lekcie som totalny magor. Stale ma myli ten nazov - dekorator. Pre mna dekorovat je ozdobit. :-) Casom na to pridem ako na to.
to som bol aj ja, ale dolezite su predosla lekcia a tak som si ich presiel dookola asi 10x a uz konecne som to asi pochopil :)