Python 你的行为如何';是否创建/声明了装饰器?
我目前正在使用Behave(BDD for 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
@给定的,@何时和@然后装饰器是如何声明的
我所做的最远的工作是查看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