gpt4 book ai didi

python - 自动发现Python装饰器

转载 作者:行者123 更新时间:2023-12-01 01:25:06 25 4
gpt4 key购买 nike

我想知道是否有标准化方法或最佳实践来扫描/自动发现装饰器,就像完成的那样 here而且还存在于其他几个库中,例如 Django、Flask。通常,装饰器在调用内部函数时提供额外/包装的功能。

在下面所示的示例中,以及在 Flask/Django(路由装饰器)中,装饰器更多地用于添加总体功能,例如最初在装饰器逻辑中生成 TCP 客户端,然后在收到消息时调用内部函数来处理它。

Flask/Django 注册一个 url 路由,其中​​内部函数仅在稍后请求 url 时调用。所有示例都需要装饰器逻辑的初始注册(扫描/发现),以初始启动总体功能。对我来说,这似乎是装饰器的另一种使用,我想了解最佳实践方法(如果有)。

参见Faust下面的示例中,装饰器 app.agent() 在 asyncio 事件循环中自动触发监听(kafka 流)客户端,然后传入消息由内部函数 hello() 稍后处理,仅当收到消息时,需要在脚本开始时首先检查/扫描/发现相关的装饰器逻辑。

import faust

class Greeting(faust.Record):
from_name: str
to_name: str

app = faust.App('hello-app', broker='kafka://localhost')
topic = app.topic('hello-topic', value_type=Greeting)

@app.agent(topic)
async def hello(greetings):
async for greeting in greetings:
print(f'Hello from {greeting.from_name} to {greeting.to_name}')

@app.timer(interval=1.0)
async def example_sender(app):
await hello.send(
value=Greeting(from_name='Faust', to_name='you'),
)

if __name__ == '__main__':
app.main()

最佳答案

什么也没有“发现”。当您从包中导入模块时,所有代码都会被执行。这就是为什么我们使用 if __name__ == '__main__' 来停止导入时执行的某些代码。当您运行代码时,装饰器将被“发现”。

我认为 Flask 蓝图 是一个很好的例子。 Here您可以在导入模块时看到它如何注册 url 端点。它所做的只是附加到列表中:

    def route(self, rule, **options):
"""Like :meth:`Flask.route` but for a blueprint. The endpoint for the
:func:`url_for` function is prefixed with the name of the blueprint.
"""
def decorator(f):
endpoint = options.pop("endpoint", f.__name__)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator

代码运行,装饰器被评估,它们只需要保留它们装饰的所有函数的一些内部列表。这些存储在Blueprint中对象。

关于python - 自动发现Python装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437740/

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