加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 如何创建/声明Behave的装饰器?

发布时间:2020-12-20 11:37:08 所属栏目:Python 来源:网络整理
导读:我目前正在使用Behave(BDD for Python)并且一直在挖掘源代码以了解如何声明@given,@ when和@then装饰器. 我离开的最远的是查看step_registry.py,在那里我找到了函数setup_step_decorators(context = None,registry = registry),它似乎正在完成这项工作. 但是
我目前正在使用Behave(BDD for Python)并且一直在挖掘源代码以了解如何声明@given,@ when和@then装饰器.

我离开的最远的是查看step_registry.py,在那里我找到了函数setup_step_decorators(context = None,registry = registry),它似乎正在完成这项工作.

但是,我不太明白这些装饰器是如何创建的,因为它们似乎没有在源代码中以def(…):的形式显式声明.我的印象是它们是基于字符串列表声明的(对于step_type in(‘given’,’when’,’then’,’step’):)然后通过调用make_decorator()来处理.

有人可以引导我完成代码并解释这些装饰器的声明位置和方式吗?

您可以在这里访问source code of Behave.

解决方法

好吧,让我们从外面开始吧:

if context is None:
    context = globals()
for step_type in ('given','when','then','step'):
    step_decorator = registry.make_decorator(step_type)
    context[step_type.title()] = context[step_type] = step_decorator

我认为这是困扰你的最后一行.

每个模块的全局命名空间只是一个字典.函数globals()返回该字典.如果修改该字典,则创建新的模块全局变量.例如:

>>> globals()['a'] = 2
>>> a
2

在这种情况下,默认情况下,context = globals().所以,对于第一个step_type,你实际上是这样做的:

>>> globals()['given'] = step_decorator

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读