跳转到主要内容

Mr. Bent懂得他的数字。

项目描述

一个穿着完美黑色夹克和条纹裤子的挑剔小男人。

简介

Mr Bent是一个框架,允许在Python应用程序中收集配置文件数据并在不同的逻辑级别查看。涉及到的三个概念是:一个插件,用于分析应用程序的代码片段;一个上下文,您想要报告数据的逻辑代码块;以及一个过滤器,一种获取有关上下文结果来源的细粒度信息的方法。

插件

插件是可调用的,被传递给“mkwrapper”函数,该函数将其应用于您的应用程序中的函数。

这看起来像

mr.bent.wrapper.mkwrapper(foo.bar, plugincallable, "myplugin")

这将导致在每次调用“foo.bar”时调用“plugincallable”,并将插件的输出添加到当前上下文中作为“myplugin”。

插件可以返回一个数字或一个可迭代对象。如果它返回一个可迭代对象,则必须包含字符串或数字。返回数字的情况被视为返回长度为1的数字的可迭代对象。

上下文

上下文存储由插件生成数据。在任何时候,都可以开始一个新的上下文,它将成为当前活动上下文的“子上下文”。如果没有当前活动上下文,将创建一个新的顶层上下文。

上下文使用创建它们的函数的点分名称命名,并将数据返回给回调。

这看起来像

def mycallback(context, result, stats):
    return "%s <!-- %s -->" % (result, `stats`)

mr.bent.wrapper.mkcontext(bar.foo, mycallback)

这个例子将导致调用返回XML的函数bar.foo,在随后的注释中返回上下文字典的repr。

当上下文结束时,它返回收集到的数据的映射。由于上下文是嵌套的,因此每次父上下文都会包含其子上下文的数据。因此,顶层上下文返回整体分析;无需手动汇总数据。

过滤器

过滤器,就像Bent先生中的大多数东西一样,是函数的包装器。这默认为可调用项的点分名称,但可以使用替代的应用程序特定名称。这对于用于渲染多个不同逻辑内容块的函数特别有用。

这看起来像

mr.bent.wrapper.mkfilter(take.me.to.the.foo.bar)

具体示例

在这个例子中,我们有一个渲染包含逻辑上不同的文件片段的HTML页面的应用程序,这些文件片段随后被包含到主页面中。

示例 1

.-------------.
|  Top level  |
`-------------'
       |
       |         .--------------------.
       |---------|  Left hand column  |
       |         `--------------------'
       |                   |
       |                   |              .-------------.
       |                   |--------------|  Login box  |
       |                   |              `-------------'
       |                   |
       |                   |
       |                   |              .------------------.
       |                   `--------------|  Navigation box  |
       |                                  `------------------'
       |
       |         .-----------------.
       |---------|  Content block  |
       |         `-----------------'
       |
       |
       |         .---------------------.
       `---------|  Right hand column  |
                 `---------------------'
                           |
                           |              .----------------.
                           `--------------|  Calendar box  |
                                          `----------------'

在这个系统中,我们有以下概念插件(为简洁起见使用简称)

t:

计时插件 此插件返回调用和停止之间的毫秒数

d:

数据库访问计数插件 此插件返回从数据库检索数据次数。

返回值可能如下所示

{'t': [5, 15, 85, 25], 'd': [0, 1, 2, 8]}
.-------------.
|  Top level  |
`-------------'
       |         {'t': [5, 15], 'd': [0,1]}
       |         .--------------------.
       |---------|  Left hand column  |
       |         `--------------------'
       |                   |              {'t': [5], 'd': [0]}
       |                   |              .-------------.
       |                   |--------------|  Login box  |
       |                   |              `-------------'
       |                   |
       |                   |              {'t': [15], 'd': [1]}
       |                   |              .------------------.
       |                   `--------------|  Navigation box  |
       |                                  `------------------'
       |         {'t': [85], 'd': [2]}
       |         .-----------------.
       |---------|  Content block  |
       |         `-----------------'
       |
       |         {'t': [25], 'd': [8]}
       |         .---------------------.
       `---------|  Right hand column  |
                 `---------------------'
                           |              {'t': [25], 'd': [8]}
                           |              .----------------.
                           `--------------|  Calendar box  |
                                          `----------------'

因此,用户在其定义的每个级别都有数据,然后可以按自己的喜好处理这些数据。

让我们再次作为doctest看一下(对不起,Florian!)

>>> from mr.bent.mavolio import create, destroy, current
>>> create("top")           # Create the top level context


>>> create("lefthand")      # Create the left hand column
>>> create("login")         # and the login portlet
>>> current()               # show that it's an empty context
{}
>>> current()['t'] = [5]    # Simulate plugin results being added to context
>>> current()['d'] = [0]
>>> destroy()               # Leave context
{'t': [5], 'd': [0]}
>>> create("nav")           # Create nav
>>> current()['t']=[15]
>>> current()['d']=[1]
>>> destroy()               # Leave nav
{'t': [15], 'd': [1]}
>>> destroy()               # Leave left hand column
{'t': [5, 15], 'd': [0, 1]}


>>> create("content")       # Enter content block
>>> current()['t'] = [85]
>>> current()['d'] = [2]
>>> destroy()               # Leave content block
{'t': [85], 'd': [2]}


>>> create("righthand")     # Enter right hand column
>>> create("cal")           # Enter calendar box
>>> current()['t']=[25]
>>> current()['d']=[8]
>>> destroy()               # Leave calendar
{'t': [25], 'd': [8]}
>>> destroy()               # Leave right hand column
{'t': [25], 'd': [8]}


>>> destroy()               # Leave the top level context, get totals
{'t': [5, 15, 85, 25], 'd': [0, 1, 2, 8]}

方法引用

实用方法

mr.bent.wrapper.mkwrapper(function, plugin, name):

使用名称将插件包装在函数周围

mr.bent.wrapper.mkcontext(function, callback):

在调用时包装函数以创建新的上下文,并在完成时关闭它,并将数据交给回调处理。

mr.bent.wrapper.mkfilter(function):

将函数包装为上下文报告数据可以过滤的键。

底层方法

mr.bent.mavolio.create(name):

创建一个名为 name 的新上下文。

mr.bent.mavolio.destroy():

结束当前上下文并返回统计信息。

mr.bent.mavolio.current():

返回当前,正在进行的上下文字典。

变更日志

1.0a1 - 未发布

  • 初始发布 [matthewwilkes, fschulze, witsch]

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分布

mr.bent-1.0a1.zip (22.6 kB 查看哈希值)

上传时间 源代码

支持