Python 你的行为如何';是否创建/声明了装饰器?

Python 你的行为如何';是否创建/声明了装饰器?,python,bdd,python-decorators,python-behave,Python,Bdd,Python Decorators,Python Behave,我目前正在使用Behave(BDD for Python),并且一直在挖掘源代码,以了解@给定的,@何时和@然后装饰器是如何声明的 我所做的最远的工作是查看step\u registry.py,在那里我找到了函数setup\u step\u decorators(context=None,registry=registry),它似乎正在做这项工作 但是,我不太明白这些装饰器是如何创建的,因为它们似乎没有在源代码中以def的形式显式声明(…):。我的印象是,它们是基于字符串列表声明的(for st

我目前正在使用Behave(BDD for Python),并且一直在挖掘源代码,以了解
@给定的
@何时
@然后
装饰器是如何声明的

我所做的最远的工作是查看
step\u registry.py
,在那里我找到了函数
setup\u step\u decorators(context=None,registry=registry)
,它似乎正在做这项工作

但是,我不太明白这些装饰器是如何创建的,因为它们似乎没有在源代码中以
def的形式显式声明(…):
。我的印象是,它们是基于字符串列表声明的(
for step\u type in('given','when','then','step'):
),然后通过调用
make\u decorator()
进行处理

有人能带我浏览一下代码并解释一下这些装饰器在哪里/如何声明吗


在这里,您可以访问。

它们被注入第90行附近的
globals()
(此时
context
globals()
,因为
context
None
):

您自己也可以这样做(
globals()
的工作原理与普通词典类似):

>>a
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“a”
>>>globals()['a']=5
>>>a
5.

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

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()
。因此,例如,对于第一个
步骤类型
,您实际上是这样做的:

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

几乎和我在同一时间举的例子完全一样。当然,在这样的例子中,正确的数字应该是2,而不是5@abarnert我注意到,奇怪的是我们都想到了那里的
'a'
。也许42岁是最好的()太棒了。多谢各位,这正是我想要的。我倾向于同意,使用42:)这个例子更容易理解
>>> globals()['a'] = 2
>>> a
2
>>> globals()['given'] = step_decorator