Thanks Chuck, all of your points seem valid to me. But someone (I can't even remember who started this thread :-)) is using a Delegation technique to write his servlets and could only get it to work by removing the check for Servlet as a base class.
Perhaps that someone could explain the technique in a bit more detail? Why are you using delegation instead of inheritance? How exactly are you doing it? Maybe we can collectively find a way to accomplish your goals without having to remove Servlet as a required base class. - Geoff > -----Original Message----- > From: Chuck Esterbrook [mailto:[EMAIL PROTECTED]] > Sent: Wednesday, April 10, 2002 6:26 PM > To: Geoffrey Talvola; [EMAIL PROTECTED] > Subject: Re: [Webware-discuss] Allowing delegation in servlets > > > On Wednesday 10 April 2002 01:53 pm, Geoffrey Talvola wrote: > > I would propose using "hasattr" to check for the existence of awake, > > respond, and sleep, and removing the assert statement. The > > RuntimeError that results could have a much better error > message than > > the assert would give us, anyhow. > > > > But I'm curious on Chuck's take on removing the assert statement. I > > somehow have a feeling that he has an opinion on this, maybe because > > it was discussed before? > > > > - Geoff > > Yes, this was discussed and decided before. Here are the points: > > - By requiring subclasses of Servlet, we can put methods in Servlet > that other parts of WebKit (like the AppServer and Application) can > make use of. > > Otherwise, if we decide to add some method like "serverSidePath" in a > version 0.4 then we basically break every WebKit application that > wasn't subclassing Servlet. > > We would either get breakage every time we added something > (when there > is often a reasonable default implementation), or we could > have to make > these methods into global functions (that would presumably check > hasattr() first to see if the servlet wanted to "override them"). > > There is a "myth" among the Python community that requiring > inheritance > is _always_ bad. It is bad if you only rely on one or two methods and > don't plan on beefing up the de facto base class. It is also bad with > builtin types in Py <= 2.2 because they couldn't be subclassed. > > - There are probably more required methods than you might think. I > doubt that it's only awake, respond and sleep. > > - Since you are already using WebKit, inheriting from Servlet (or a > subclass is extremely easy): > > from WebKit.HTTPServlet import HTTPServlet > class Foo(HTTPServlet): > pass > > - Python provides multiple inheritance so you're not locked into just > inheriting from WebKit. > > - Invoking hasattr() multiple times will be more expensive than one > isinstance(). > > - Checking isinstance() guards against the "duplicate module" bug we > experienced earlier. > > > > It sounds like the assert should be changed to an "if: raise" to be > more clear and avoid being "optimized out". > > -Chuck > > > > > > > -----Original Message----- > > > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] > > > Sent: Monday, April 08, 2002 3:31 PM > > > To: [EMAIL PROTECTED] > > > Subject: Re: [Webware-discuss] Allowing delegation in servlets > > > > > > On Mon, Apr 08, 2002 at 02:43:37PM -0400, Geoffrey Talvola wrote: > > > > > My first attempt failed because line 183 of ServletFactory is: > > > > > > > > > > assert issubclass(theClass, Servlet) > > > > > > > > > > Anyway, I'd like to argue for the removal of the assertion in > > > > > ServletFactory, since it is denying use of a very powerful, > > > > > and arguably > > > > > better technique than inheritance. In any case, assertions > > > > > can be optimized > > > > > away in .pyo files, so that the presence of the assertion > > > > > statement is of > > > > > questionable value... > > > > > > > > I think the assertion is there to help out the Webware user > > > > > > who forgets to > > > > > > > have their servlet inherit from Servlet. I assume that > > > > > > mistake happens > > > > > > > relatively frequently. I know I've done it once or twice. > > > > > > Without the > > > > > > > assertion (which pinpoints the problem pretty clearly), > > > > > > presumably you would > > > > > > > wind up with a traceback somewhere else in the guts of > > > > > > Appliction.py that > > > > > > > would be less obvious to track down, especially for a casual > > > > user. > > > > > > > > Now you've identified a legitimate use for a servlet not > > > > > > derived from > > > > > > > Servlet. So you want to remove the assertion, but that > > > > > > would hurt casual > > > > > > > Webware users hwo might forget the base class. So maybe > > > > > > there should be an > > > > > > > option "AllowServletsNotDerivedFromServlet" that defaults > > > > > > to 0, but you can > > > > > > > just flip the switch and it skips the assertion? I would > > > > > > imagine this to be > > > > > > > documented as "for experts". > > > > > > If a servlet must always subclass Servlet, or at least we pretend > > > to require that for the default case, the exception should be > > > changed from > > > AssertionError to something else. AssertionError mean "I" made an > > > error. Other exceptions mean "you" made an error. > > > > > > But perhaps we need to rethink what are the requirements for > > > servlets. At minimum, awake/respond/sleep methods. This sounds > > > like an interface. > > > Since Python doesn't have interfaces (yet), we've been using > > > "must be a > > > subclass of Servlet" as a substitute. > > > > > > The simplest way to avoid the issubclass test and yet not > introduce > > > an esoteric option like > AllowServletsNotDerivedFromServlet would be > > > to test explicitly for the required features: > > > > > > if not hasattr(theClass, 'respond'): raise RuntimeError(...) > > > > > > try: > > > theClass.respond > > > except AttributeError: > > > raise RuntimeError(...) > > > > > > if not hasattr(theClass, 'respond') or \ > > > type(theClass.respond) != types.MethodType: > > > raise RuntimeError(...) > > > > > > requiredMethods = 'awake', 'respond', 'sleep' > > > for methMame in requiredMethods: > > > try: > > > meth = getattr(theClass, methName) > > > if type(meth) != types.MethodType: > > > raise RuntimeError("not a method...") > > > except AttributeError: > > > raise RuntimeError("method doesn't exist...") > > > > > > > > > -- > > > -Mike (Iron) Orr, [EMAIL PROTECTED] (if mail problems: [EMAIL PROTECTED]) > > > http://iron.cx/ English * Esperanto * Russkiy * > > > Deutsch * Espan~ol > > > > > > _______________________________________________ > > > Webware-discuss mailing list > > > [EMAIL PROTECTED] > > > https://lists.sourceforge.net/lists/listinfo/webware-discuss > _______________________________________________ Webware-discuss mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/webware-discuss