Dav*_*ric 5 python lua design-patterns
我对Python比较陌生,想知道我是在重新发明轮子还是用非pythonic方式做事 - 读错了.
我正在重写一些最初用Lua编写的解析器.有一个函数接受来自导入表及其值的字段名称,对值执行一些操作并将其存储在适当的键名下的目标字典中.
在原始代码中,它通过类似开关的语句解决,匿名函数作为操作.Python代码如下所示:
class TransformTable:
target_dict = {}
...
def mapfield(self, fieldname, value):
try:
{
'productid': self.fn_prodid,
'name': self.fn_name,
'description': self.fn_desc,
...
}[fieldname](value)
except KeyError:
sys.stderr.write('Unknown key !\n')
def fn_name(val):
validity_check(val)
target_dict['Product'] = val.strip().capitalize()
...
Run Code Online (Sandbox Code Playgroud)
当然,每个"字段处理程序"函数都会执行不同的操作并存储在target_dict中的不同键中.因为Python不支持带语句的匿名函数(或者我错过了什么?)函数必须单独编写,这些函数的代码可读性较低且不必要地复杂.
任何提示如何以更优雅和更pythonic的方式执行此类任务是值得赞赏的.
谢谢
大卫
我不久前在回答标题为“ python 中的 switch case 不起作用;需要另一种模式”的问题时应用了类似于 @Matti Virkkunen'a 的方法。它还演示了处理未知字段的相对简单且优雅的方式。在您的示例中音译为术语,它看起来像这样:
class TransformTable:
target_dict = {}
def productid(self, value):
...
def name(self, value):
validity_check(value)
self.target_dict['Product'] = value.strip().capitalize()
def description(self, value):
...
def _default(self, value):
sys.stderr.write('Unknown key!\n')
def __call__(self, fieldname, value):
getattr(self, fieldname, self._default)(value)
transformtable = TransformTable() # create callable instance
transformtable(fieldname, value) # use it
Run Code Online (Sandbox Code Playgroud)