|
Graham Dumpleton
grahamd at dscpl.com.au
Tue Mar 1 18:39:27 EST 2005
Graham Dumpleton wrote ..
> Now I haven't looked too deeply into new style classes, but from some
> where I have got it in my head that one should be able to using new
> style classes create new methods and dynamically setup the parameters
> they accept. If this is true then _extra_path_info could be replaced
> with a magic method which would create a wrapper around a function
> and automatically fill into the __call__() method all the parameters
> which the wrapped method was expecting. Used in conjunction with
> decorators in Python 2.4, I am speculating that one could simple write:
>
> @extra_path_info
> def method(req):
> return req.path_info,req.extra_path_info
>
> The only problem with this even if it can be done, is that the object which
> wraps the function most likely is an instance of a new style class and
> presently, mod_python.publisher cannot traverse into new style classes.
> Luckily the vampire::publisher code I have and will release at some point
> will, so I can try it out and see how it goes.
Actually, in vampire::publisher I don't need new style classes as I can
reuse one of my internal methods for parameter matching and write:
from vampire.lookup import _params
class _extra_path_info_kw:
def __init__(self,callback,path=""):
self.__callback = callback
self.__path = path
def __call__(self,**args):
if args.has_key("req"):
args["req"].extra_path_info = self.__path
status,kwargs,expected = _params(self.__callback)
if status != apache.OK:
raise apache.SERVER_RETURN, status
if kwargs == False:
for name in args.keys():
if name not in expected:
del args[name]
return self.__callback(**args)
def __getattr__(self,name):
if name[0] != '_':
return _extra_path_info_kw(self.__callback,'/'.join([self.__path,name]))
raise AttributeError()
class A:
def __init__(self):
self.method = _extra_path_info_kw(self.method)
def method(self,req,arg1="1",arg2="2"):
return req.path_info,req.extra_path_info,arg1,arg2
a = A()
This gives me with one method a way of wrapping methods with
arbitrary form parameters.
In mod_python.publisher there is parameter matching code as well in
util.apply_fs_data() and as a result one can write:
from mod_python import util
class _extra_path_info_kw:
def __init__(self,callback,path=""):
self.__callback = callback
self.__path = path
def __call__(self,req):
req.extra_path_info = self.__path
return util.apply_fs_data(self.__callback,req.form,req=req)
def __getattr__(self,name):
if name[0] != '_':
return _extra_path_info_kw(self.__callback,'/'.join([self.__path,name]))
raise AttributeError()
class A:
def __init__(self):
self.method = _extra_path_info_kw(self.method)
def method(self,req,arg1="1",arg2="2"):
return req.path_info,req.extra_path_info,arg1,arg2
a = A()
This is though going to result in a second processing of req.form in the
case of mod_python.publisher.
Anyway, time to get back to some real work. :-)
Graham
|