Python Forum
decorators within decorators
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
decorators within decorators
#1
I am trying to build decorators within decorators.
I thought I take the example I have discussed previously.
I have a function that multiplies x and y.
My decorator function just prints out a statement saying "x*y = "
I have now added a superdecorator function around my decorator function where I now want to multiply (n*x)*(n*y) i.e. if n=2 then I want to multiply the double of x and the double of y.
Here is my code below but I am getting an error message

print('{} * {} = '.format(*args*n,**kwargs*n), end='')
TypeError: unsupported operand type(s) for *: 'dict' and
def superdecorator(n):
    def decorator(func):
        def wrapped(*args, **kwargs):
            print('{} * {} = '.format(*args*n,**kwargs*n), end='')
            return func(*args*n, **kwargs*n)
        return wrapped
    return decorator
 
 
@superdecorator(2)
def mult(x,y):
    return x*y
Reply
#2
Thank for share this
กำถั่ว
Reply
#3
Why don't you implement that check in the first decorator?
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply
#4
ok, I just take it as no one on here really knows how to do this.
Reply
#5
Just wrap the the first decorator into a wrapper function and return it.

def superdecorator(decorator):
    def wrapper(*args, **kwargs):
        def decorator(func):
            def wrapped(*args, **kwargs):
                print('{} * {} = '.format(*args*n,**kwargs*n), end='')
                return func(*args*n, **kwargs*n)
            return wrapped
        return decorator
    return wrapper
But you will have a problem with the function names.
Actually this happens with the first decorator too. If you have any docstrings in the decorated function you will lose it. See functools.wraps
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply
#6
Some point,decorators within decorators with several argument is confusing for most.
I know well how it works,but can really struggle if i haven't look it at for a while.
(Mar-28-2018, 05:28 PM)wavic Wrote: If you have any docstrings in the decorated function you will lose it. See functools.wraps
Yes this is important,also wrapt take this further.
Graham Dumpleton Wrote:The wrapt module focuses very much on correctness.
It therefore goes way beyond existing mechanisms such as functools.wraps() to ensure that decorators preserve introspectability,
signatures, type checking abilities etc.
So if i should done anything serious with decorator today i would look into using wrapt
Graham Dumpleton author of wrapt: Hear no evil, see no evil.

David Beazley Decorators with Arguments.

Decorators can be useful,two of my favorite Python packages use decorator Flask and Click .
I used Click in my tutorial here
So the user interface get clean by hiding all code that's not needed to be shown,
like cheeking for path with type=click.Path(exists=True).
This also mean that i don't have to write error checking for Path in my code.
@click.command() 
@click.argument('file', type=click.Path(exists=True), metavar='<file>')
def play(file):
   ....
Reply
#7
Ok,sir Good Explain Thank you again.royal1688
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Decorators @ annotation drcl 3 337 Feb-24-2024, 06:12 AM
Last Post: Gribouillis
  Does @ at sign used for tother than decorators? ggpython000 1 497 Oct-12-2023, 09:08 AM
Last Post: buran
  Variable Scopes Decorators oclmedyb 6 2,669 Jan-15-2021, 02:13 PM
Last Post: oclmedyb
  Decorators and return statements JonEdward 2 1,857 Jul-24-2020, 05:02 PM
Last Post: JonEdward
  How to print cache from Decorators with Memoization OlgaM 2 2,016 Jan-29-2020, 05:06 PM
Last Post: OlgaM
  Python decorators. dodiko1d 0 6,960 Oct-13-2019, 10:23 AM
Last Post: dodiko1d
  Decorators yksingh1097 2 2,473 Aug-14-2018, 01:44 PM
Last Post: yksingh1097
  learning decorators Prince_Bhatia 6 3,240 Aug-13-2018, 02:28 PM
Last Post: Prince_Bhatia
  decorators mp3909 9 5,487 Mar-25-2018, 05:28 PM
Last Post: mp3909

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020