Closed anyush closed 4 years ago
GitHub ukrył podłogi, oczywiście, że tam jest nie "name", tylko <dwie podłogi>name<dwie podłogi>
wraps powinien robić to samo co ten z biblioteki standardowej. Powinien przepisywać część atrybutów metod, żeby nie tracić informacji o tym co jest wywołane.
wraps powinien robić to samo co ten z biblioteki standardowej. Powinien przepisywać część atrybutów metod, żeby nie tracić informacji o tym co jest wywołane.
Ten z biblioteki standardowej bierze w nawiasach argument - funkcję, skąd musi przepisywać atrybuty (@wraps(funkcja) - te nawiasy z funkcją są obowiązkowe, ale w przykładzie ich nie ma). Dlatego ponawiam pytanie: w tym drugim przypadku z początku dyskusji skąd atrybuty muszą być przepisywane do inner2, gdyż tego argumentu nie ma?
w drugim przypadku powinien przepisać atrybuty inner2
Okej, już nie znam jak jeszcze to wytłumaczyć. Dołączam kod , który robi dokładnie to samo, co functools.wraps dla tych kilku atrybutów. Testów to nie przechodzi, co więcej, przy uruchomieniu przykładu z repl.it za pomocą samego functools.wraps, assert wyrzuca błąd.
def wraps(f_attrs_from): ....def real_decor(f_to_decorate): ........# zdaję sobie sprawę, że f_to_decorate - zmienna lokalna ........f_to_decorate.name = f_attrs_from.name ........f_to_decorate.module = f_attrs_from.module ........f_to_decorate.doc = f_attrs_from.doc ........f_to_decorate.qualname = f_attrs_from.qualname ........f_to_decorate.annotations = f_attrs_from.annotations ........return f_to_decorate ....return real_decor
Pełna zgoda!
Brawa za czujność. Mati wprowadz fixa do zadania :)
Wprowadzone. Poprzednio nadesłane rozwiązania zostały usunięte.
Proszę o wyjaśnienie, co musi robić dekorator wraps bez żadnych argumentów, który musimy napisać.
Ja rozumiem, jak działa taka konstrukcja: ... @wraps(f) def inner1(*args, *kwargs): ... Ale co musi robić taka: ... @wraps def inner2(args, **kwargs): ... ? Jeżeli w pierwszym przypadku np. inner1.name == f.name, to czemu musi być równe inner2.name? Jakim imieniem jego podmieniać? Dodam jeszcze, że to zadanie może być rozwiązane w bardzo dziwny (bo jest po-pierwsze za łatwy, a po drugie znika jakikolwiek sens użycia tego dekoratora) sposób.