有一个函数返回字典是一种好的编程习惯吗? (这样旧代码就不会中断)

时间:2019-05-18 22:35:56

标签: python dictionary

我正在触摸一个旧的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']

1 个答案:

答案 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))