用于数据转换的 Python 设计模式

标签 python mongodb design-patterns

我发现自己经常做这样的事情:

if 'id' in kwargs:
    query['_id'] = ObjectID(kwargs.pop('id'))
if 'name' in kwargs:
    query['event'] = kwargs.pop('name')
if 'keywords' in kwargs:
    keywords = kwargs.pop('keywords')
    query['keywords'] = {
        '$in': keywords
    }

忽略实现细节。这里的要点是,我正在处理两个共享相似数据的数据结构,并执行简单、重复和更复杂的转换。

是否有任何设计模式或其他开发人员友好的方法可以使这些类型的转换更易于编码?

我考虑过创建一个表和关联函数来转换简单的属性名称,但我有一种感觉,在处理更复杂的数据转换时效果不佳。而且,从长远来看,这种方法可能不会为我节省大量工作。

有什么建议吗?

最佳答案

你至少可以用 map 清除if。当我有一大组变换时,我喜欢这样做。

transforms = {'id' : ('_id', lambda val: ObjectID(val)),
              'name' : ('event', lambda val: val),
              'keywords' : ('keywords', lambda val: val)}
for kwargs_key in kwargs.keys():
    try:
        query_key, transform = transforms[kwargs_key]
    except KeyError:
        # Default or error handling
    else:
        query[query_key] = transform(kwargs.pop(kwargs_key))

如果您将其包装在一个类中,并使 transforms 成为一个类或实例属性,您甚至可以根据需要在运行时轻松添加或覆盖转换。

关于用于数据转换的 Python 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16529980/

相关文章:

python - 元组元素在列表中的位置

python - 如何使用pygtk打印图像

mongodb - 使用先前的序列号或时间戳运行时,从 Kinesis 读取给出空记录

python - 图像未加载为灰度(skimage)

加载 socket.io.js 时 Node.js "Uncaught SyntaxError: Unexpected token <"

javascript - 如何在 Mongoose 中检索子文档

algorithm - 构建算法决策树

events - 如何在 Dart 中实现事件类型

c# - 我什么时候可以在 native foreach 循环上使用 List<T>.ForEach?

python - 从 3 开始遍历列表