我在Python中有六个不同的API,它们都具有功能相同的方法,但名称不同,它们各自在每个站点上都有各自的功能。我想避免重复相同的代码6次,并为所有六个创建一个包装器,它将具有统一的功能,每个相应的文件都会理解为调用它们的“自己的”功能。 AKA,如果我有一个getData1()
,另一个getData2()
,依此类推,我想创建一个函数getData()
,可以用每个相应的Python库调用一次,这样我就可以了不必多次写入相同的逻辑。
最有效的方法是什么?这实际上是节省时间还是比单独编码我需要的每个API逻辑更复杂(我将编写一些非常冗长的逻辑)?
进程是编写库,只是让包装器中的每个函数调用调用文件中的函数,或者我必须重写所有名称是相同的(也有一些具有不同的参数,但它们是在功能上等同于我想做的事情)
谢谢,我之前从未做过这样的事情(实际上刚开始学习如何与Python中的API进行交互)
答案 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())
这使用getattr
和setattr
执行繁重的工作,*args/**kwargs
确保所有参数都传递到原始类。
请注意,映射时可以包含或省略特定的API方法(例如API2
没有postData
方法)。
让我知道是否有任何部分不适合您想要实现的目标,或者您不了解。