gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:17:13 27 4
gpt4 key购买 nike

我目前正在使用 Behave(Python 的 BDD)并且一直在挖掘源代码以了解 @given@when@then 正在声明装饰器。

我走得最远的地方是查看 step_registry.py,我在其中找到了函数 setup_step_decorators(context=None, registry=registry),它似乎正在执行这份工作。

但是,我不太明白这些装饰器是如何创建的,因为它们似乎没有在源代码中以 def when(...) 的形式显式声明: .我的印象是它们是根据字符串列表声明的(for 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

关于python - Behave 的装饰器是如何创建/声明的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25213417/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com