0

当我编写一些实用程序时,注册它然后用getUtility它查询就可以了:

class IOperation(Interface):
    def __call__(a, b):
        ''' performs operation on two operands '''

class Plus(object):
    implements(IOperation)
    def __call__(self, a, b):
        return a + b
plus = Plus()

class Minus(object):
    implements(IOperation)
    def __call__(self, a, b):
        return a - b
minus = Minus()


gsm = getGlobalSiteManager()

gsm.registerUtility(plus, IOperation, '+')
gsm.registerUtility(minus, IOperation, '-')

def calc(expr):
    a, op, b = expr.split()
    res = getUtility(IOperation, op)(eval(a), eval(b))
    return res

assert calc('2 + 2') == 4

现在,据我了解,我可以将实用程序的注册移至configure.zcml,如下所示:

<configure xmlns="http://namespaces.zope.org/zope">

<utility
    component=".calc.plus"
    provides=".calc.IOperation"
    name="+"
    />

<utility
    component=".calc.minus"
    provides=".calc.IOperation"
    name="-"
    />

</configure>

但我不知道如何让全局站点管理员阅读这个 zcml。

4

2 回答 2

1

您从其他一些 ZCML 文件中包含它

<include package="your.package" />

如果您正在从头开始编写应用程序,则必须拥有一个顶级 ZCML 文件,该文件首先<utility>通过包含正确注册所有 ZCML 指令(例如 ),meta.zcml然后才能在您自己包含的 ZCML 文件中使用它们:

<include package="zope.component" file="meta.zcml" />

在 Python 端,您使用zope.configuration.xmlconfig模块中的 API 之一来加载 ZCML 文件:

  • zope.configuration.xmlconfig.file
  • zope.configuration.xmlconfig.string
  • zope.configuration.xmlconfig.xmlconfig
  • zope.configuration.xmlconfig.XMLConfig

哪一个?它们有何不同?我不知道!这一切都应该记录在案,但我无法做出正面或反面!我xmlconfig.stringZODBBrowser中使用过,它似乎可以工作,但这是个好主意吗?我不知道!

如果您重视自己的理智,请不要使用 Zope。

于 2014-11-30T19:31:35.720 回答
0

实际上,完成这项工作所需的一切 - 将 zcml 的解析移至另一个文件。因此,解决方案现在包含三个文件:

calc.py

from zope.interface import Interface, implements
from zope.component import getUtility

class IOperation(Interface):
    def __call__(a, b):
        ''' performs operation on two operands '''

class Plus(object):
    implements(IOperation)
    def __call__(self, a, b):
        return a + b

class Minus(object):
    implements(IOperation)
    def __call__(self, a, b):
        return a - b

def eval(expr):
    a, op, b = expr.split()
    return getUtility(IOperation, op)(float(a), float(b))

configure.zcml

<configure xmlns="http://namespaces.zope.org/zope">
<include package="zope.component" file="meta.zcml" />

<utility
    factory="calc.Plus"
    provides="calc.IOperation"
    name="+"
    />

<utility
    factory="calc.Minus"
    provides="calc.IOperation"
    name="-"
    />
</configure>

并且main.py

from zope.configuration import xmlconfig
from calc import eval

xmlconfig.file('configure.zcml')

assert eval('2 + 2') == 4
于 2014-12-13T17:18:17.040 回答