在Web.py / MIMERender应用程序中重复类装饰器

时间:2012-03-18 23:09:47

标签: python inheritance

我是Python的新手,显然我发现它非常棒。

具体来说,我正在使用Web.py和MIMERender构建一个小型数据API。

我已经这样组织了它:DB中的每个表都有一个带有三个类的相应模块。

# Define URL endpoints
urls = (

# Index
'/',                                'index',

# Disclosures
'/disclosure/listAll',              'Disclosures',
'/disclosure/page/(.+)',            'DisclosurePage',
'/disclosure/(.+)',                 'Disclosure',

)

每个类都在一个单独的文件中定义。例如,这三个披露类在disclosure.py中定义:(请注意:由于定义过于复杂并且会分散主要问题,因此非常伪造)

import web


# Define response formats
render_xml = lambda **args: dict2xml(args).display()
render_json = lambda **args: json.dumps(args)

class Disclosure:

@mimerender(
    default = 'json',
    xml  = render_xml,
    json = render_json,
)

def GET(self, primaryKey):

    ... ( retrieval and formatting ) ...
            return { 'response' : someResponse }

在每个模块的顶部,我按照MIMERender定义lambda函数,然后在类定义的每个中包含必要的类装饰器。

问题是,我似乎在重复自己。在每个模块中,如上例所示,有三个类要定义,我必须在每个模块中放置相同的类装饰器。此外,每个模块的开头都包含相同的lamba函数。

如果我更熟悉Python如何处理这类事情,我可以删除每个模块17个或更多的LOC。

有什么方法可以让A)模块整体继承lambda函数定义,而B)每个类方法都继承类装饰器?

提前致谢!

1 个答案:

答案 0 :(得分:1)

我认为最简单的清理方法是将渲染函数和装饰器放入一个单独的模块中,例如: foo.py,像这样:

from mimerender import FlaskMimeRender

def render_json(**view):
    """ do whatever """

def render_xml(**view):
    """ do whatever """

def render_html(**view):
    """ do whatever """

mimerender = FlaskMimeRender()(
    default = "html",
    html = render_html,
    xml = render_xml,
    json = render_json,
)

现在您的类文件如下所示:

from foo import mimerender

class Disclosure:
    @mimerender
    def GET(self, primaryKey):
        """ do stuff """

这里唯一的技巧是foo.py需要in your path或者你need to do a relative import,但这些都是完全不同的问题。