On 2017-04-12 21:42, andrew.hol...@otternetworks.de wrote:
Hi,

I'm trying to work out how to pass parameters through decorators:

class Meow():

     def __init__(self, arg1, arg2):
         print("INIT ClassBasedDecoratorWithParams")
         print(arg1)
         print(arg2)

     def makebold(self, fn):
             def wrapped():
                 return "<b>" + fn() + "</b>"
             return wrapped

banana = Meow("foo", "bar")
@banana.makebold("foobar")

def hello():
     return "hello world"

print(hello())


Returns error:
INIT ClassBasedDecoratorWithParams
Traceback (most recent call last):
foo
   File "/Users/andrew/PycharmProjects/untitled3/meow5.py", line 15, in <module>
bar
     @banana.makebold("foobar")
TypeError: wrapped() takes 0 positional arguments but 1 was given


so I add a var to wrapped:

     def makebold(self, fn):
             def wrapped(flibble):
                 print(flibble)
                 return "<b>" + fn() + "</b>"
             return wrapped

Returns error:
INIT ClassBasedDecoratorWithParams
Traceback (most recent call last):
foo
bar
   File "/Users/andrew/PycharmProjects/untitled3/meow5.py", line 16, in <module>
<function hello at 0x1029198c8>
     @banana.makebold("foobar")
   File "/Users/andrew/PycharmProjects/untitled3/meow5.py", line 11, in wrapped
     return "<b>" + fn() + "</b>"
TypeError: 'str' object is not callable

This is confusing me. How do I get hold of the "foobar" string so I can use it 
in the decorator?

You're passing "foobar" into 'makebold' in the parameter 'fn' and then trying to call 'fn' in the return statement. You can't call a string.
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to