I ran into these lines of code in the QPYTHON Android app. They are part of a sample that uses the Bottle module to create a simple Web server that seems to work fine.
app = Bottle()
app.route('/', method='GET')(home)
app.route('/__exit', method=['GET','HEAD'])(__exit)
app.route('/__ping', method=['GET','HEAD'])(__ping)
app.route('/assets/<filepath:path>', method='GET')(server_static)
Now, I know that all the functions in parentheses after the call have already been wrapped with the @route decorator above this. For example:
@route('/__ping')
def __ping():
return "ok"
But I have no idea what putting things in parentheses after other things does in Python, and after trying a hundred different permutations of "functions in parentheses after functions" I gave up.
I throw myself on the mercy of the Exchange.
2 Answers 2
This:
app.route('/', method='GET')(home)
... Is the same as this:
func = app.route('/', method='GET')
func(home)
In other words, app.route(...)
returns a function, which is then called.
def a():
def b(arg):
return arg * 2
return b
print(a()(5))
c = a()
print(c(5))
Output:
10
10
You are basically providing an argument for the function within the function, a.k.a inner function
route
returns another function, and that dynamically selected function is then called with the argumenthome
(for instance). Look up higher-order functions.foo(bar, baz)
callsfoo
with the argumentsbar
andbaz
,foo(bar)(baz)
callsfoo
with the argumentbar
and then calls whateverfoo
returns with the argumentbaz
. In this case,@route
is a decorator (i.e. a callable that returns a callable) that takes parameters: stackoverflow.com/questions/5929107/…