如何在python中覆盖应用程序中多个位置使用的函数



我有一些函数使用S3访问资源,这些函数在我的应用程序中的许多地方都使用这些S3代码保存在aws_resource.py脚本中。

def create_client():
client = boto3.client('s3',
region_name=current_app.config["REGION_NAME"],
aws_access_key_id=current_app.config["AWS_ACCESS_KEY_ID"],
aws_secret_access_key=current_app.config["AWS_SECRET_ACCESS_KEY"])
return client

def create_resource():
s3 = boto3.resource('s3',
region_name=current_app.config["REGION_NAME"],
aws_access_key_id=current_app.config["AWS_ACCESS_KEY_ID"],
aws_secret_access_key=current_app.config["AWS_SECRET_ACCESS_KEY"])
return s3
def boto_object_read(bucket_name, key):
client = create_client()
response = client.get_object(Bucket=bucket_name, Key=key)
return response

def boto_object_write(bucket_name, key):
s3 = create_resource()
return s3.Object(bucket_name, key)

用于代码的许多部分。

from ..aws_resource import create_client, create_resource
s3 = create_resource()
obj = s3.Object(bucket_name, key_prediction)

现在,我们的应用程序正在转移到Azure我不想更改许多地方已经存在的函数调用

我想基于环境变量覆盖这些方法。所以下面的代码

def create_resource():
if os.environ.get("CLOUD_ENV") == "AWS":
s3 = boto3.resource('s3',
region_name=current_app.config["REGION_NAME"],
aws_access_key_id=current_app.config["AWS_ACCESS_KEY_ID"],
aws_secret_access_key=current_app.config["AWS_SECRET_ACCESS_KEY"])
else:
s3 = azure_lib("storage", region_name="something",..)
return s3

如果我重新创建一个具有AWS和AZURE方法的新类,然后实例化并调用这些方法(我不想这样做(,我的方法应该是什么。这是最好和最可扩展的方法,下次我想扩展到GCP平台,使用不同的方法。

将函数从"aws_resource.py";至";real_aws_resource.py";(或任何名称(。为azure编写具有相同名称的函数,并将它们放在"中;azure_resource.py";。

在";aws_resource.py";放置类似的东西

if os.environ.get("CLOUD_ENV") == "AWS":
from .real_aws_resource import *
elif <platform is Azure>:
from .azure_resource import *

根据模块的位置,导入可能需要进行一些调整。

最新更新