I'm building an application with cherrypy and have started using
decorators quite extensively. A lot of my exposed functions look like:
@expose
@startTransactrionAndBuildPage
@partOfTabUi(tabId)
@convert(arg1=int, arg2=str)
def do_main_page(self, arg1, arg2):
some code
I've become really fond of decorators and use them quite a lot. I've
also ready that function calls are expensive in python. In the above
example, does the interpreter call 5 different functions? 13 2200
vinjvinj <vi******@gmail.com> wrote: I'm building an application with cherrypy and have started using decorators quite extensively. A lot of my exposed functions look like:
@expose @startTransactrionAndBuildPage @partOfTabUi(tabId) @convert(arg1=int, arg2=str) def do_main_page(self, arg1, arg2): some code
I've become really fond of decorators and use them quite a lot. I've also ready that function calls are expensive in python. In the above example, does the interpreter call 5 different functions?
At def-execution time, presumably 6 (the two decorators w/o args, plus 2
each for those w/args); at call time, it depends what the decorators are
doing (if each adds exactly one wrapping closure, for example, there
will indeed be 5 nested calls). Unfortunately I do not know much of
today's cherrypy internals, so I don't know what each decorator is doing
internally.
Alex
vinjvinj wrote: I'm building an application with cherrypy and have started using decorators quite extensively. A lot of my exposed functions look like:
@expose @startTransactrionAndBuildPage @partOfTabUi(tabId) @convert(arg1=int, arg2=str) def do_main_page(self, arg1, arg2): some code
I've become really fond of decorators and use them quite a lot. I've also ready that function calls are expensive in python. In the above example, does the interpreter call 5 different functions?
Without reading your code I can't be sure, but this is sure looking like
the classic "to a man with only a hammer all problems look like a nail"
solution. I'm not going to tell you that decorators aren't the answer to
all programming problems, because you already know that in your heart :-)
regards
Steve
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd www.holdenweb.com
Love me, love my blog holdenweb.blogspot.com
>> solution. I'm not going to tell you that decorators aren't the answer to all programming problems, because you already know that in your heart :-
I was fearing that. The expose decorator is the only one that comes
with cherrypy. The other ones are mine and are of the format:
def decorator(func):
def wrapper(self, *args, **kwargs)
some code
return wrapper
I'll stick with what I'm doing currently and eventually (if the need
arises from a performance perspective) merge the three into one
decorator. I'll also need to eventually add a caching docrator.Do other
people have this problem, especially for developing web applications.
How many decorators, if any, do you use?
@expose -> cherrypy decorator
@startTransactrionAndBuildPage -> starts a db transaction, populates
the user in the session. Does some error handling. Adds header, footer
and error messages to the page.
@partOfTabUi -> besides the top level navigation, I have tab level
(with actions) for navigation on individual pages
@convert -> this converts boolean like 'True' or '0' to python True,
'231' -> int
@cache -> (not implemented, but will ad it).
I would love to hear other people's experience with using decorators
for web application building.
> @expose -> cherrypy decorator @startTransactrionAndBuildPage -> starts a db transaction, populates the user in the session.
I guess that is ok - transaction handling is a "classic" for decorator-like
concepts. After all, you don't want
begin()
try:
pass
commit()
finally:
if not comitted():
rollback()
all over the place.
Does some error handling. Adds header, footer and error messages to the page.
That sounds like something for the templating engine, and _certainly_ not
for a decorator that otherwise deals with transactions.
@partOfTabUi -> besides the top level navigation, I have tab level (with actions) for navigation on individual pages
Template I guess.
@convert -> this converts boolean like 'True' or '0' to python True, '231' -> int
Looks ok to me.
@cache -> (not implemented, but will ad it).
I would love to hear other people's experience with using decorators for web application building.
I used them in turbogears (which builds on cherrypy) - and I found them
useful for some aspects.
Diez
"vinjvinj" wrote: I'm building an application with cherrypy and have started using decorators quite extensively. A lot of my exposed functions look like:
@expose @startTransactrionAndBuildPage @partOfTabUi(tabId) @convert(arg1=int, arg2=str) def do_main_page(self, arg1, arg2): some code
I've become really fond of decorators and use them quite a lot. I've also ready that function calls are expensive in python. In the above example, does the interpreter call 5 different functions?
the decorators themselves are only called when the function is defined.
what happens at runtime depends on what the decorators do (in pretty
much the same way as the output and execution time for this script
x = lambda: return "hello"
x = foo(x)
x = fie(x)
x = fum(x)
print x()
depends on what the foo, fie, and fum functions do...)
</F>
>>That sounds like something for the templating engine, and _certainly_ not for a decorator that otherwise deals with transactions.
The actual code for the page layout is in a preppy template. But the
calls to the template engine are made in the
startTransactrionAndBuildPage decorator
Template I guess.
Seemed like an overkill for the template engine.
"vinjvinj" wrote: I was fearing that. The expose decorator is the only one that comes with cherrypy. The other ones are mine and are of the format:
def decorator(func): def wrapper(self, *args, **kwargs) some code return wrapper
what exactly made you think that Python would be able to run your
code *without* calling your function ?
</F>
"vinjvinj" <vi******@gmail.com> wrote in message
news:11**********************@j33g2000cwa.googlegr oups.com... I'm building an application with cherrypy and have started using decorators quite extensively. A lot of my exposed functions look like:
@expose @startTransactrionAndBuildPage @partOfTabUi(tabId) @convert(arg1=int, arg2=str) def do_main_page(self, arg1, arg2): some code
I've become really fond of decorators and use them quite a lot. I've also ready that function calls are expensive in python. In the above example, does the interpreter call 5 different functions?
As Alex said, perhaps. A decorator that would not result in a runtime call
would be one that, for example, registers the function somewhere and
returns it unchanged and unwrapped. @expose and @partOfTabUI both seem
like they might do something like that.
IF the overhead becomes a problem, and if you use the same stack (or parts
of a stack) of decorators for multiple functions, then you could write a
few decorators that combine multiple actions with one call.
Terry Jan Reedy
>>what exactly made you think that Python would be able to run your code *without* calling your function ?
I was hoping that when the compiler finds decorators with wrapers that
have the same signature it can some how "magically" combine them into
one function (which gets called at run time) and not have 5 nested
function calls. That is similar to what I will have to do eventually.
Given python's dynamic nature, I'm sure there are reasons why this is
not done.
vinjvinj schrieb: That sounds like something for the templating engine, and _certainly_ not for a decorator that otherwise deals with transactions.
The actual code for the page layout is in a preppy template. But the calls to the template engine are made in the startTransactrionAndBuildPage decorator
Well, even if it would fit in a decorator - it certainly belongs to its
_own_ decorator.
Diez
Diez B. Roggisch <de***@nospam.web.de> wrote:
... begin() try: pass commit() finally: if not comitted(): rollback()
Feels like a natural for 2.5's 'with' statement -- as has been the case
for 2.3 and 2.4, 2.5 won't have many language-level changes, but what
little there IS, is... wonderful!
with transaction():
...your code goes here...
is SO much better than the try/finally routine...!
Alex
vinjvinj <vi******@gmail.com> wrote: what exactly made you think that Python would be able to run your code *without* calling your function ?
I was hoping that when the compiler finds decorators with wrapers that have the same signature it can some how "magically" combine them into one function (which gets called at run time) and not have 5 nested function calls. That is similar to what I will have to do eventually.
Given python's dynamic nature, I'm sure there are reasons why this is not done.
Yep, you'll have to build new functions yourself if you need them:-(
Alex
vinjvinj wrote: I'm building an application with cherrypy and have started using decorators quite extensively. A lot of my exposed functions look like:
@expose @startTransactrionAndBuildPage @partOfTabUi(tabId) @convert(arg1=int, arg2=str) def do_main_page(self, arg1, arg2): some code
I've become really fond of decorators and use them quite a lot. I've also ready that function calls are expensive in python. In the above example, does the interpreter call 5 different functions?
A typical function calls a few other functions already, so three extra
function calls (I suppose expose just sets an attribute) shouldn't matter
much. You shouldn't even start rewriting your code unless you have
identified do_main_page() as a performance bottleneck. In a web app,
candidates would be functions that are called hundred or thousand times per
rendered page rather than once. Does do_main_page() render a complete page?
Forget optimizing three function calls away. You will see no effect.
Peter This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Michael Sparks |
last post by:
Anyway...
At Europython Guido discussed with everyone the outstanding issue with
decorators and there was a clear majority in favour of having them, which
was good. From where I was sitting it...
|
by: sandy |
last post by:
Hi All,
I am a newbie to MySQL and Python. At the first place, I would like to
know what are the general performance issues (if any) of using MySQL
with Python.
By performance, I wanted to...
|
by: serge |
last post by:
I have an SP that is big, huge, 700-800 lines.
I am not an expert but I need to figure out every possible way that
I can improve the performance speed of this SP.
In the next couple of weeks I...
|
by: zzfreddybb |
last post by:
We are using HP aCC compiler on a HP Itanium box ( 11.23)
We are having some severe performance hits using exception
handling ( try/catch ) scenarios.
The online aCC documentation says:
HP...
|
by: 1944USA |
last post by:
I am re-architecting a C# application written as a multithreaded
Windows Service and trying to squeeze every bit of performance out of
it.
1) Does the thread that an object is instantiated on...
|
by: Magnus |
last post by:
Im using the new binding features of Visual Studio 2005. I have done the
steps to create a bound data source, and selected all 40 tables from the
database. The wizard generated the necessary code...
|
by: dandorey1 |
last post by:
I'm currently in the process of writing a realtime telephony
application. I've designed it with a fairly simply plugin architecture.
When I first started reading about this the general suggestion...
|
by: Sugandh Jain |
last post by:
Hi,
The warning from Microsoft.Performance Code Analysis check that,
its not required to initialize numeric variables to zero, boolean to false
and object to null is a good one because CLR does...
|
by: amollokhande1 |
last post by:
Hi,
I would like to know whether is any performance impact on sql server while using N as prefix in the sql query. For instance if have used following query
to insert the data in fields of CHAR,...
|
by: taylorcarr |
last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
by: aa123db |
last post by:
Variable and constants
Use var or let for variables and const fror constants.
Var foo ='bar';
Let foo ='bar';const baz ='bar';
Functions
function $name$ ($parameters$) {
}
...
|
by: ryjfgjl |
last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
| |