【发布时间】:2021-04-13 02:51:38
【问题描述】:
我正在尝试为我们团队编写的未来 lambdas 提出一个很好的模式。
其中一个目标是尝试向一些团队成员教授面向对象的开发,所以我想在这里使用这种模式。我在其他真正的 lambda 上运行良好,但尝试添加有用的库 'aws-lambda-powertools-python' 我遇到了一些问题。
Lambda 代码:
from aws_lambda_powertools import Logger
logger = Logger()
class LambdaExample:
@classmethod
def get_handler(cls, *args, **kwargs):
"""Get handler"""
def handler(event, context):
return cls(*args, **kwargs).handle(event, context)
return handler
@logger.inject_lambda_context(log_event=True)
def handle(self, event, context):
logger.info("Hello World")
lambda_handler = LambdaExample.get_handler()
The docs for powertools 有一个 pytest 的代码示例。他们的代码示例虽然不是一个完整的文件,但似乎假定 lambda 处理程序是一个独立的函数而不是一个类方法。我试图适应它:
from collections import namedtuple
import pytest
from lambda_example import LambdaExample
@pytest.fixture
def lambda_context():
lambda_context = {
"function_name": "test",
"memory_limit_in_mb": 128,
"invoked_function_arn": "arn:aws:lambda:eu-west-1:809313241:function:test",
"aws_request_id": "52fdfc07-2182-154f-163f-5f0f9a621d72",
}
return namedtuple("LambdaContext", lambda_context.keys())(*lambda_context.values())
class TestLambdaHandler:
def test_handle_will_pass_when_env_setup(self, lambda_context):
# Given
test_event = {'test': 'event'}
lambda_handler = LambdaExample()
# When
lambda_handler.handle(test_event, lambda_context)
我得到的结果是:
> lambda_handler.handle(test_event, lambda_context)
E TypeError: decorate() takes 2 positional arguments but 3 were given
如果我从处理程序方法中删除这一行,一切正常: "@logger.inject_lambda_context(log_event=True)"
问题似乎是装饰器不适用于方法上的 'self' 参数。
关于如何进行的任何想法?
【问题讨论】:
-
为什么要使用面向对象的包装器来混淆非 OO Lambda 函数调用?
-
在这个简单的例子中没有显示,但在一个完整的例子中,lambda 对象正在实例化依赖项并将它们连接在一起。基本上是依赖注入的简单实现。由于依赖类不需要解决它们自己的依赖关系,因此测试它们更容易。我也更喜欢这种模式,而不是使用全局变量在多个 lambda 调用中重用资源
标签: python amazon-web-services aws-lambda