我发现自己经常做这样的事情:
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/