1

I'm currently learning Python and have been at it for about six months. I've made a lot of progress and am now trying to wrap my head around decorators. I understand the general idea behind decorators and have written a handful of simple decorators in a basic format, but this time I am trying to write a function that can use a decorator more than once:

For example, the following:

def make_html(element):
    def wrapped(func, *args, **kwargs):
        return f'<{element}>' + func(*args, **kwargs) + f'</{element}>'
    return wrapped

@make_html('strong')
def get_text(text='I code in Python.'):
    return text

print(get_text)

Outputs this:

<strong>I code in Python.</strong>

However, if I actually call the function when I print:

print(get_text())

I get this:

Traceback (most recent call last):
  File "AppData/Local/Programs/Python/Python38/search and sort2.py", line 98, in <module>
    print(get_text())
TypeError: 'str' object is not callable

Similarly, if I try to use the same decorator more than once on a function:

@make_html('p')
@make_html('strong')
def get_text(text='I code in Python.'):
    return text

I get this:

Traceback (most recent call last):
  File "AppData/Local/Programs/Python/Python38/search and sort2.py", line 94, in <module>
    def get_text(text='I code in Python.'):
  File "Local/Programs/Python/Python38/search and sort2.py", line 83, in wrapped
    return f'<{element}>' + func(*args, **kwargs) + f'</{element}>'
TypeError: 'str' object is not callable

Any ideas as to what is going wrong here? How can I use the same decorator more than once on a function, and why is my function being interpreted as a string?

jonrsharpe
  • 115,751
  • 26
  • 228
  • 437
J. B.
  • 155
  • 1
  • 8

0 Answers0