具有非标准属性的可定制管道的设计模式

时间:2019-05-10 18:52:09

标签: python design-patterns pipeline higher-order-functions

我正在尝试促进创建管道,该管道在管道中每个元素之间传递字典以进行数据处理。

我能够创建一个标准管道,其中从“模块”开始,该模块返回字典,然后将其传递到管道中的下一个元素,以执行字典的某种处理/操作,然后传递它到下一个元素,等等...我面临的问题是,对于管道中的每个“管道”,传递给管道的字典中的键可能与管道正在寻找的键不匹配。

例如:

def add_last_name(data, **kwargs):
  last_name = kwargs["last_name"]
  return {"full_name": "%s %s"%(data["first_name"], last_name)}

def add_middle_name_to_first_and_last(data, **kwargs):
  middle_name = kwargs["middle_name"]
  # looks for property named 'whole_name', instead of 'full_name'
  first_name, last_name = data["whole_name"].split()
  return {"first_middle_last": " ".join([first_name, middle_name, last_name])

def add_age(data, **kwargs):
  data["age"] = kwargs["age"]
  return data

# data = {"first_name": "john"} -> 
#  add_last_name(data, **{"last_name": "smith"}) 
# . returns {"full_name": "john smith"} -> 
#  add_age(data, **{"age": 30})
# . returns {"full_name": "john smith", "age": 30} ->
#  add_middle_name_to_first_and_last(data, **{"middle_name": "doe"})
# . This fails because the "whole_name" key does not exist

基本上,所有这些都归结为以下事实:您无法控制所有这些不同模块中使用的键名,并且我需要一种在管道中的链接之间转换模块属性的方法。我意识到我可以只使用严格的属性名,但是我想在数据/属性不可知方面进行最大的灵活性,并将这些链接留给管道的创建者(用户),因此我需要某种方式将属性名称从先前的链接链接到当前链接的机制。模块应为类,并在内部定义其“必需的参数名称”。

0 个答案:

没有答案