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



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

使用适配器模式怎么样?

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

最新更新