Po pierwsze - Kacper! Po drugie, trochę tak jest, temat jest ciut bardziej skomplikowany niż inne, ale to nic bo już niedługo ruszają zapisy na coś wyjątkowego.. od podstaw :)
Kilka dodatkowych przykładów wspomnianych przez Kacpra (debugging, pomiar czasu wykonywania funkcji) masz tutaj gist.github.com/Zearin/2f40b7b9cfc51132851a#how-can-the-decorators-be-useful
@@melonio1974 Będę robił to co mi wychodzi - będę się dzielił wiedzą :) Przygotowujemy z Bartkiem mega długi i rozbudowany kurs, można by go było nawet nazwać Bootcampem :) dotyczący Pythona, od podstaw do tematów takich jak ten i bardziej skomplikowanych. Więcej szczegółów za około miesiąc :)
Super filmik! Nie do końca rozumiem tylko jedną rzecz (17:39) -> print(reapeat(3)(hello)('Python')) dlaczego nie jest: print(reapeat(3)(hello('Python')) ? Bo przecież Python jest przekazywany jako name do funkcji hello?
Bo tak działają dekoratory, tzn. dekorator zwraca funkcje, która jako argument przyjmuje funkcję którą dekorujesz, ale nie jest ona wywołana. Twoje argumenty zawsze są jako ostatnie. Po prostu tak one działają :)
Dokładnie tak jak napisał Kacper, dekoratoru po prostu tak działają, też miałem zonk przez 2-3 dni ale zakodowała mi się w końcu ta składnia.Mam tylko jedno pytanie- na jednym kursie tłumaczono mi że aby móc korzystać z dekoratorów trzeba zaimportować functools....
Sposób przekazywania informacji ok ale przeszkadza ilość okienek na ekranie. Ja np. na bieżąco sobie piszę. Jak czasem coś przegapię to muszę albo cofać, albo zatrzymywać, bo za chwilę okno konsoli zasłoni kod.
Pytanko czy jak zapisze funkcje def uppercase(func): Return func().upper() To nie będzie to prostsze wyjście? Bo samo zagnieżdżanie funkcji rozumiem tylko nie rozumiem tej idei? Byłbym wdzięczny za wyjaśnienie różnicy.
a jakie argumenty przyjmuje Twoje func? :) Mógłbyś zrobić coś podobnego, ale nie będzie to wtedy dekoratorem tylko przekazaniem funkcji jako argument :)
@@KacperSieradziński czyli rozumiem ze dekorator pozwala przekazać funkcje tak aby wykonała się wewnątrz dekoratora razem z wszystkimi jej argumentami?
@@GrzegorzPlichta dokładnie tak. W ten sposób dajesz możliwość deweloperom dodawania różnych Twoich dekoratorów wtedy kiedy potrzebują. A do czego mogą służyć to już zależy od Ciebie. :)
Dzień dobry! Kolega niżej o to pytał, ale ja chciałem tylko to sobie poukładać. To, że wywołuje się funkcje w sposób print(repeat(3)(hello)('Python')) Jest składnia dekoratora? Oraz jeszcze jedno: Dlaczego przy wywołaniu funkcji foo na początku również pisał Pan : uppercase(foo)() Skoro to była zwykła funkcja? Nie powinno być po prostu : uppercase(foo)? Pozdrawiam! Damian
1. Tak to może być składnią dekoratora 2. Dekorator odbiera funkcję która jest niewywołana i od razu się wywołuje. Czyli w przykładzie który dałeś(przejdźmy na Ty bardzo proszę! ) Jako argument odbieramy funkcję foo, która jest niewywołana. Dopiero będziemy ją wywoływać wewnątrz dekoratora. Natomiast od razu wywołujemy też funkcję uppercase. Chętnie wytłumaczę jaśniej na discordzie :-) Zapraszam!
@@KacperSieradziński dziękuję za szybką odpowiedź! 2 - czyli taka składnie używa się tylko do dekoratorów, jak dobrze rozumiem? Bardzo chętnie wejdę na discorda. 😉
@@damianszczerba3458 Discord: dokodu.dev/discord :-) Nie tylko.. ogólnie gdy przekazujesz funkcję do funkcji. Mam film o programowaniu funkcyjnym, tam troszkę o tym mówię. Polecam! :)
@@KacperSieradziński Czy to ten film? - th-cam.com/video/ZqIMdcImfXk/w-d-xo.html Kurde to mnie zaskoczyleś byłem przekonany, że można jednym sposobem tylko. 😅 Super, dzięki!
Aby zrozumieć dekoratory w pythonie trzeba najpierw dobrze zrozumieć funkcje zagnieżdżone i przekazywanie funkcji jako parametr. Nauka programowania nie lubi pośpiechu i drogi na skróty. Poza tym video super szczególnie na fakt omówienia wszystkich przypadków przekazywania parametrów: to funkcji "dekorowanej", do wrappera i do samego dekoratora. Można do tego dodać jeszcze pojęcie funkcji zamkniętych i w 90% praktycznych zastosowań to wystarczy. Moim skromnym zdaniem. Dziękujemy i prosimy o więcej. p.s. A tym printem to proszę się nie przejmować. Mam to samo. W moim przypadku to nawyk z powłoki IPython'a. Do dobrego łatwo się przyzwyczaić.
możesz uzyskać oryginalną funkcję, która została udekorowana, przypisując ją do zmiennej przed użyciem dekoratora )) . def decorator(func): def wrapper(*args, **kwargs): print("Wykonuje się dekorator") return func(*args, **kwargs) return wrapper def func(argument): print("Wykonuje się funkcja") return argument # Przypisanie oryginalnej funkcji do zmiennej original_func = func # Udekorowanie funkcji func = decorator(func) # Użycie oryginalnej funkcji original_func("Argument")
Dekoratory przypominają mi trochę callbacki w języku C. Dekoratory wyglądają na trochę prostsze do ogarnięcia. Niestety tak samo jak callbacki w C są tak samo mało czytelne i "zakręcone" dla kogoś kto poznaje dopiero ich składnię i ideę używania. Zrozumienie dekoratorów i nauczenie się z nich korzystać wymaga dużo, dużo ćwiczeń. Niestety dla początkujących to jest coś co może odstraszyć od pythona.
Nieśmiertelny tekst "u mnie działa". Dobrze wytłumaczone 👍
Dzięki :)
🐍 MOJE SZKOLENIA: dokodu.it
💬 DISCORD: dokodu.dev/discord
📌 LINKI: sieradzinski.pl
O GIGA!
Używałem dekoratorów skopiowanych ze stackoverflow, ale pojęcia nie miałem jak to działa! Działało więc nie ruszałem. Dzięki!
Też tak robiłem :D ale jak się nauczyłem jakie to fajne to pomyślałem, że i Wam pokaże ;)
To już trzeba na spokojnie przemyśleć, bo dużo informacji :) Dobrze, że na końcu podał Pan przykłady użycia tego w praktyce
Po pierwsze - Kacper! Po drugie, trochę tak jest, temat jest ciut bardziej skomplikowany niż inne, ale to nic bo już niedługo ruszają zapisy na coś wyjątkowego.. od podstaw :)
Kilka dodatkowych przykładów wspomnianych przez Kacpra (debugging, pomiar czasu wykonywania funkcji) masz tutaj gist.github.com/Zearin/2f40b7b9cfc51132851a#how-can-the-decorators-be-useful
@@KacperSieradziński ciekaw jestem co to będzie to coś wyjątkowego :D
@@melonio1974 Będę robił to co mi wychodzi - będę się dzielił wiedzą :) Przygotowujemy z Bartkiem mega długi i rozbudowany kurs, można by go było nawet nazwać Bootcampem :) dotyczący Pythona, od podstaw do tematów takich jak ten i bardziej skomplikowanych. Więcej szczegółów za około miesiąc :)
@@KacperSieradziński już się piszę na to 😃 jeśli chodzi o Ciebie i o Bartka to każdy kurs biorę w ciemno i wiem że będzie dobrze 👍😃
Super filmik!
Nie do końca rozumiem tylko jedną rzecz (17:39) -> print(reapeat(3)(hello)('Python'))
dlaczego nie jest:
print(reapeat(3)(hello('Python'))
? Bo przecież Python jest przekazywany jako name do funkcji hello?
Bo tak działają dekoratory, tzn. dekorator zwraca funkcje, która jako argument przyjmuje funkcję którą dekorujesz, ale nie jest ona wywołana. Twoje argumenty zawsze są jako ostatnie. Po prostu tak one działają :)
Dokładnie tak jak napisał Kacper, dekoratoru po prostu tak działają, też miałem zonk przez 2-3 dni ale zakodowała mi się w końcu ta składnia.Mam tylko jedno pytanie- na jednym kursie tłumaczono mi że aby móc korzystać z dekoratorów trzeba zaimportować functools....
Czesc, mam pytanie, można zamiast pisać dodatkowego wrappera zapisać w funkcji repeat jako argumenty (func, times) ?
Jak najbardziej możesz stworzyć dekorator z dodatkowym parametrem. Wydawało mi się, że wspominam o tym w filmie.. Czy nie? :)
Sposób przekazywania informacji ok ale przeszkadza ilość okienek na ekranie. Ja np. na bieżąco sobie piszę. Jak czasem coś przegapię to muszę albo cofać, albo zatrzymywać, bo za chwilę okno konsoli zasłoni kod.
Dzięki Serwerynie :-) To jeden z pierwszych moich filmów. Staram się by te nowsze były lepsze 🙂
Pytanko czy jak zapisze funkcje
def uppercase(func):
Return func().upper()
To nie będzie to prostsze wyjście?
Bo samo zagnieżdżanie funkcji rozumiem tylko nie rozumiem tej idei?
Byłbym wdzięczny za wyjaśnienie różnicy.
a jakie argumenty przyjmuje Twoje func? :) Mógłbyś zrobić coś podobnego, ale nie będzie to wtedy dekoratorem tylko przekazaniem funkcji jako argument :)
@@KacperSieradziński czyli rozumiem ze dekorator pozwala przekazać funkcje tak aby wykonała się wewnątrz dekoratora razem z wszystkimi jej argumentami?
@@GrzegorzPlichta dokładnie tak. W ten sposób dajesz możliwość deweloperom dodawania różnych Twoich dekoratorów wtedy kiedy potrzebują.
A do czego mogą służyć to już zależy od Ciebie. :)
@@KacperSieradziński super, dzięki :)
BTW świetne filmy i dobrze wyjaśnione :)
@@GrzegorzPlichta bardzo dziękuję za miłe słowo. Jest jakiś temat na jaki czekasz? :)
Dzień dobry!
Kolega niżej o to pytał, ale ja chciałem tylko to sobie poukładać.
To, że wywołuje się funkcje w sposób
print(repeat(3)(hello)('Python'))
Jest składnia dekoratora?
Oraz jeszcze jedno:
Dlaczego przy wywołaniu funkcji foo na początku również pisał Pan :
uppercase(foo)()
Skoro to była zwykła funkcja? Nie powinno być po prostu :
uppercase(foo)?
Pozdrawiam!
Damian
1. Tak to może być składnią dekoratora
2. Dekorator odbiera funkcję która jest niewywołana i od razu się wywołuje. Czyli w przykładzie który dałeś(przejdźmy na Ty bardzo proszę! ) Jako argument odbieramy funkcję foo, która jest niewywołana. Dopiero będziemy ją wywoływać wewnątrz dekoratora. Natomiast od razu wywołujemy też funkcję uppercase.
Chętnie wytłumaczę jaśniej na discordzie :-) Zapraszam!
@@KacperSieradziński dziękuję za szybką odpowiedź!
2 - czyli taka składnie używa się tylko do dekoratorów, jak dobrze rozumiem?
Bardzo chętnie wejdę na discorda. 😉
@@damianszczerba3458 Discord: dokodu.dev/discord :-)
Nie tylko.. ogólnie gdy przekazujesz funkcję do funkcji. Mam film o programowaniu funkcyjnym, tam troszkę o tym mówię. Polecam! :)
@@KacperSieradziński Czy to ten film? - th-cam.com/video/ZqIMdcImfXk/w-d-xo.html
Kurde to mnie zaskoczyleś byłem przekonany, że można jednym sposobem tylko. 😅
Super, dzięki!
@@damianszczerba3458 od tego co podesłałeś zacznij, a potem zobacz ten: th-cam.com/video/EXrlTGramXQ/w-d-xo.html
Aby zrozumieć dekoratory w pythonie trzeba najpierw dobrze zrozumieć funkcje zagnieżdżone i przekazywanie funkcji jako parametr. Nauka programowania nie lubi pośpiechu i drogi na skróty. Poza tym video super szczególnie na fakt omówienia wszystkich przypadków przekazywania parametrów: to funkcji "dekorowanej", do wrappera i do samego dekoratora. Można do tego dodać jeszcze pojęcie funkcji zamkniętych i w 90% praktycznych zastosowań to wystarczy. Moim skromnym zdaniem.
Dziękujemy i prosimy o więcej.
p.s. A tym printem to proszę się nie przejmować. Mam to samo. W moim przypadku to nawyk z powłoki IPython'a. Do dobrego łatwo się przyzwyczaić.
możesz uzyskać oryginalną funkcję, która została udekorowana, przypisując ją do zmiennej przed użyciem dekoratora )) .
def decorator(func):
def wrapper(*args, **kwargs):
print("Wykonuje się dekorator")
return func(*args, **kwargs)
return wrapper
def func(argument):
print("Wykonuje się funkcja")
return argument
# Przypisanie oryginalnej funkcji do zmiennej
original_func = func
# Udekorowanie funkcji
func = decorator(func)
# Użycie oryginalnej funkcji
original_func("Argument")
Za poleceniem kierownika z ostatniego filmu wracam do dekoratorów.
Mądry wybór
💚
@@KacperSieradziński how many times moge znowu zaczynac to od nowa :I
@@kontoyoutubowe3317 I think that you should wiele razy :)
Dekoratory przypominają mi trochę callbacki w języku C. Dekoratory wyglądają na trochę prostsze do ogarnięcia. Niestety tak samo jak callbacki w C są tak samo mało czytelne i "zakręcone" dla kogoś kto poznaje dopiero ich składnię i ideę używania.
Zrozumienie dekoratorów i nauczenie się z nich korzystać wymaga dużo, dużo ćwiczeń. Niestety dla początkujących to jest coś co może odstraszyć od pythona.
nigdy nie programowalem w C, ale dziękuję za komentarz :-)