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

时间:2018-01-19 18:30:01

标签: python json

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

最有效的方法是什么?这实际上是节省时间还是比单独编码我需要的每个API逻辑更复杂(我将编写一些非常冗长的逻辑)?

进程是编写库,只是让包装器中的每个函数调用调用文件中的函数,或者我必须重写所有名称是相同的(也有一些具有不同的参数,但它们是在功能上等同于我想做的事情)

谢谢,我之前从未做过这样的事情(实际上刚开始学习如何与Python中的API进行交互)

1 个答案:

答案 0 :(得分:1)

我能想到的最好的方法是首先构建通用名称到API特定名称的映射。接下来定义一个'包装' class,它接受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())

这使用getattrsetattr执行繁重的工作,*args/**kwargs确保所有参数都传递到原始类。

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

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