⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 args.py

📁 xen虚拟机源代码安装包
💻 PY
字号:
#============================================================================# This library is free software; you can redistribute it and/or# modify it under the terms of version 2.1 of the GNU Lesser General Public# License as published by the Free Software Foundation.## This library is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU# Lesser General Public License for more details.## You should have received a copy of the GNU Lesser General Public# License along with this library; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA#============================================================================# Copyright (C) 2004, 2005 Mike Wray <mike.wray@hp.com>#============================================================================import typesimport StringIOfrom xen.xend import sxpclass ArgError(StandardError):    passclass Args:    """Argument encoding support for HTTP.    """        def __init__(self, paramspec, keyspec):        self.arg_ord = []        self.arg_dict = {}        self.key_ord = []        self.key_dict = {}        for (name, typ) in paramspec:                self.arg_ord.append(name)                self.arg_dict[name] = typ        for (name, typ) in keyspec:                self.key_ord.append(name)                self.key_dict[name] = typ    def get_args(self, d, xargs=None):        args = {}        keys = {}        params = []        if xargs:            self.split_args(xargs, args, keys)        self.split_args(d, args, keys)        for a in self.arg_ord:            if a in args:                params.append(args[a])            else:                raise ArgError('Missing parameter: %s' % a)        return (params, keys)    def split_args(self, d, args, keys):        for (k, v) in d.items():            if k in self.arg_dict:                typ = self.arg_dict[k]                val = self.coerce(typ, v)                args[k] = val            elif k in self.key_dict:                typ = self.key_dict[k]                val = self.coerce(typ, v)                keys[k] = val            else:                raise ArgError('Invalid parameter: %s' % k)    def get_form_args(self, f, xargs=None):        d = {}        for (k, v) in f.items():            if ((k not in self.arg_dict) and                (k not in self.key_dict)):                continue            if isinstance(v, types.ListType):                n = len(v)                if n == 0:                    continue                elif n == 1:                    val = v[0]                else:                    raise ArgError('Too many values for %s' % k)            else:                val = v            d[k] = val        return self.get_args(d, xargs=xargs)    def coerce(self, typ, v):        try:            if typ == 'int':                val = int(v)            elif typ == 'long':                val = long(v)            elif typ == 'str':                val = str(v)            elif typ == 'sxpr':                val = self.sxpr(v)            elif typ == 'bool':                val = self.bool(v)            else:                raise ArgError('invalid type:' + str(typ))            return val        except ArgError:            raise        except StandardError, ex:            raise ArgError(str(ex))    def bool(self, v):        return (v.lower() in ['on', 'yes', '1', 'true'])    def sxpr(self, v):        if isinstance(v, types.ListType):            val = v        elif isinstance(v, types.FileType) or hasattr(v, 'readline'):            val = self.sxpr_file(v)        elif isinstance(v, types.StringType):            val = self.sxpr_file(StringIO.StringIO(v))        else:            val = str(v)        return val    def sxpr_file(self, fin):        try:            vals = sxp.parse(fin)        except:            raise ArgError('Coercion to sxpr failed')        if len(vals) == 1:            return vals[0]        else:            raise ArgError('Too many sxprs')    def call_with_args(self, fn, args, xargs=None):        (params, keys) = self.get_args(args, xargs=xargs)        return fn(*params, **keys)    def call_with_form_args(self, fn, fargs, xargs=None):        (params, keys) = self.get_form_args(fargs, xargs=xargs)        return fn(*params, **keys)class ArgFn(Args):    """Represent a remote HTTP operation as a function.    Used on the client.    """    def __init__(self, fn, paramspec, keyspec = None):        if keyspec == None:            keyspec = {}        Args.__init__(self, paramspec, keyspec)        self.fn = fn    def __call__(self, fargs, xargs=None):        return self.call_with_args(self.fn, fargs, xargs=xargs)    class FormFn(Args):    """Represent an operation as a function over a form.    Used in the HTTP server.    """    def __init__(self, fn, paramspec, keyspec = None):        if keyspec == None:            keyspec = {}        Args.__init__(self, paramspec, keyspec)        self.fn = fn    def __call__(self, fargs, xargs=None):        return self.call_with_form_args(self.fn, fargs, xargs=xargs)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -