我是 Python 新手,显然我发现它很棒。
具体来说,我正在使用 Web.py 和 MIMERender 构建一个小型数据 API。
我是这样组织的:数据库中的每个表都有一个包含三个类的相应模块。
# Define URL endpoints
urls = (
# Index
'/', 'index',
# Disclosures
'/disclosure/listAll', 'Disclosures',
'/disclosure/page/(.+)', 'DisclosurePage',
'/disclosure/(.+)', 'Disclosure',
)
每个类都在单独的文件中定义。例如,在discovery.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 函数,然后在每个类定义中包含必要的类装饰器。
问题是,我似乎在重复自己。在每个模块中,如上面的示例所示,需要定义三个类,并且我必须在每个模块中放置完全相同的类装饰器。此外,每个模块的开头都包含相同的 lba 函数。
如果我更熟悉 Python 如何处理此类事情,我可以为每个模块删除 17 个或更多 LOC。
有什么方法可以让 A)整个模块继承 lambda 函数定义,B)每个类方法继承类装饰器?
提前致谢!
最佳答案
我认为清理这个问题的最简单方法是将渲染函数和装饰器放入单独的模块中,例如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 ,但这些是完全不同的问题。
关于python - 在 Web.py/MIMERender 应用程序中重复类装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9763162/