我正在触摸一个旧的Python函数,该函数当前返回一个列表。现在,它也需要返回状态代码。
但是此更改将破坏一些现有代码,对吗?
所以我在想.....如果(从现在开始)我所有的函数都返回字典呢?这样,调用者便可以使用所需的数据,并且如果我决定在某个时候添加更多输出,旧代码也不会中断。
我想知道这是否曾经被实践过?我在这里错过了什么吗,或者这可能是一个过大的杀伤力?
编辑:
这里是一个例子:
def GetDataFromWeb(url):
X = GetXFromWeb(url) # This function takes 5 seconds to complete
Y = GetYFromWeb(url) # This function also takes 5 seconds to complete
return X + Y
现在假设我们也需要乘积X * Y。一种解决方案是让另一种功能来完成这项工作:
def GetDataFromWeb_2(url):
X = GetXFromWeb(url) # This function takes 5 seconds to complete
Y = GetYFromWeb(url) # This function also takes 5 seconds to complete
return X * Y
但是当我们同时需要总和和乘积时,显然浪费了时间(因为昂贵的Web请求被两次调用了)
所以我们最终诉诸于:
def GetDataFromWeb(url):
X = GetXFromWeb(url) # This function takes 5 seconds to complete
Y = GetYFromWeb(url) # This function also takes 5 seconds to complete
return (X + Y, X * Y)
但是现在,使用原始版本的GetDataFromWeb()的代码将中断。
我正在考虑的事情如下:
def GetDataFromWeb(url):
X = GetXFromWeb(url) # This function takes 5 seconds to complete
Y = GetYFromWeb(url) # This function also takes 5 seconds to complete
return {'sum' : X + Y}
可以始终扩展为
def GetDataFromWeb(url):
X = GetXFromWeb(url) # This function takes 5 seconds to complete
Y = GetYFromWeb(url) # This function also takes 5 seconds to complete
return {'sum' : X + Y, 'product' : X*Y }
旧代码仍然可以使用:
sum = GetDataFromWeb(url)['sum']
答案 0 :(得分:1)
如何使用适配器模式?
https://www.tutorialspoint.com/python_design_patterns/python_design_patterns_adapter.htm
适配器模式充当两个不兼容接口之间的桥梁。 这种设计模式属于结构模式,因为 模式结合了两个独立接口的功能。
此模式涉及一个类,该类负责加入 独立或不兼容接口的功能。现实生活 例如读卡器可以充当适配器 在存储卡和笔记本电脑之间。您将存储卡插入 读卡器和读卡器插入笔记本电脑,以便存储卡 可以通过笔记本电脑读取。
适配器设计模式有助于一起工作类。它转换 根据需要将类的接口转换为另一个接口。 该模式包括一个物种的多态性,它命名一个名字 和多种形式。说一个可以按照 需求收集。
编辑
使用关键字参数可能更简单。
def do(u, ops={'sum': sum}):
x = u[0]
y = u[1]
if len(ops) == 1:
return list(ops.values())[0]((x, y))
else:
return {k: o((x, y)) for k, o in ops.items()}
print(do([1, 2]))
print(do([1, 2], ops={'prod':lambda x: x[0] * x[1]}))
print(do([1, 2], ops={'sum': sum, 'prod':lambda x: x[0] * x[1]}))
或更简单。
def do(u, flag_new=False):
x = u[0]
y = u[1]
if flag_new is False:
return x + y
else:
return {'sum': x + y, 'prod': x * y}
print(do([1, 2]))
print(do([1, 2], flag_new=True))