我想使用dynamodb local进行基于python / boto3的应用程序的本地(单元)测试。
现在我可以做这样的事情
if test_mode:
client = boto3.client("dynamodb", endpoint_url="localhost:8000")
resource = boto3.resource("dynamodb", endpoint_url="localhost:8000")
else:
client = boto3.client("dynamodb")
resource = boto3.resource("dynamodb")
但我想避免test_mode
检查。
我可以以某种方式"准备" boto3所以dynamodb端点URL是全局设置的吗?
更新
进一步解释我想要什么。我想要某种功能,我可以说:
boto3.setGlobalDynamodbEndpoint("http://localhost:8000")
这样,在调用此函数后,我会这样做:
client = boto3.client("dynamodb")
resource = boto3.resource("dynamodb")
端点将自动设置为"http://localhost:8000"
答案 0 :(得分:0)
据我所知,boto3
库中没有内置函数可以为您完成此操作,但是您可以使用Python标准库中的functools.partial
utility获得类似的结果。该工具接受一个Python callable和一个或多个参数,然后返回一个执行相同操作的新可调用对象,但这些参数为“预设”。在函数式编程术语中,这称为"partially applying"一个函数(因此名为partial
)。
例如,
import functools
import boto3
URL = "http://localhost:8000"
boto3.client = functools.partial(botot3.client, endpoint_url=URL)
boto3.resource = functools.partial(boto3.resource, endpoint_url=URL)
通过将boto3.client
和boto3.resource
重新定义为我们的新部分,而不是库中的原始版本,我们就是monkey-patching boto3
。
稍后在您的代码中调用:
client = boto3.client("dynamodb")
resource = boto3.resource("dynamodb")
您无需显式传递endpoint_url
,因为客户端和资源对象将使用partial
对象中先前设置的URL值自动实例化。
答案 1 :(得分:0)
我刚刚向 boto3 项目提交了一个 PR,以使用 env var 来覆盖 endpoint_url,这可能对此有用。