Python 什么';创建API包装器的最佳方法是什么?

Python 什么';创建API包装器的最佳方法是什么?,python,json,Python,Json,我在Python中有六个不同的API,它们都有功能相同的方法,但名称不同,并且它们在每个站点上都有各自的功能。我希望避免重写同一代码6次,并为所有6个具有统一函数的代码创建一个包装器,每个文件都将其理解为调用“自己的”函数。也就是说,如果一个函数上有getData1(),另一个函数上有getData2(),依此类推,那么我想创建一个函数getData(),每个Python库可以调用一次,这样我就不必多次编写相同的逻辑 最有效的方法是什么?这会比单独编写我需要的每个API的逻辑(我将编写一些相当长

我在Python中有六个不同的API,它们都有功能相同的方法,但名称不同,并且它们在每个站点上都有各自的功能。我希望避免重写同一代码6次,并为所有6个具有统一函数的代码创建一个包装器,每个文件都将其理解为调用“自己的”函数。也就是说,如果一个函数上有
getData1()
,另一个函数上有
getData2()
,依此类推,那么我想创建一个函数
getData()
,每个Python库可以调用一次,这样我就不必多次编写相同的逻辑

最有效的方法是什么?这会比单独编写我需要的每个API的逻辑(我将编写一些相当长的逻辑)节省时间还是更复杂

这个过程是编写库并在包装器中进行每个函数调用并调用文件中的函数,还是我必须重写所有名称以使其相同(另外,有些名称具有不同的参数,但它们在功能上与我想要做的相同)


谢谢,我以前从未做过类似的事情(实际上,我刚刚开始学习如何在Python中与API交互)

我能想到的最好方法是首先构建泛型名称到API特定名称的映射。接下来定义一个“包装”类,该类接受一个api和任何潜在的api参数,然后迭代映射,实例化api类(具有适当的属性),然后创建“别名”属性,指向原始属性:

class API1():
    def __init__(self, url):
        self.url = url

    def getData1(self):
        return "Getting " + self.url

    def postData1(self):
        return "Posting " + self.url

class API2():
    def __init__(self, url, username):
        self.url = url

    def getData2(self):
        return "Getting " + self.url + " for " self.username

class wrapped_api():
    mapping = {
    "getData": {
        "API1": "getData1",
        "API2": "getData2",
    },
    "postData": {
        "API1": "postData1",
    }
}
    def __init__(self, api, *args, **kwargs):
        instance = api(*args, **kwargs)
        for key, val in self.mapping.items():
            if api.__name__ in val:
                setattr(self, key, getattr(instance, val[api.__name__]))

api1 = wrapped_api(API1, "http://api1.example.com")
api2 = wrapped_api(API2, "http://api2.example.com", "alice")
print(api1.getData()
print(api1.postData())
print(api2.getData())
这将使用
getattr
setattr
来完成繁重的工作,并使用
*args/**kwargs
来确保将所有参数传递给原始类

请注意,映射时可以包括或省略特定的API方法(例如,
API2
没有
postData
方法)


让我知道是否有任何部分不太符合您想要实现的目标,或者您不理解。

为了清楚起见-我是否正确地认为您有6个API类,每个API类都有功能等效的方法,但名称不同(即在API 1中称为
getData1()
,而在API 2中称为
getData2())
etc?您需要某种包装器,根据使用的API将
getData
映射到适当的方法?@完全匹配。如果不太清楚,很抱歉。要进一步澄清,
getData()
应该匹配相应API类中的适当方法,并调用它。您是想调用API2吗?API2=wrapped_API(API2,“,”alice“)