我对 Python 比较陌生,想知道我是在重新发明轮子还是以非 Python 方式做事 - 看错了。
我正在重写一些最初用 Lua 编写的解析器。有一个函数接受导入表中的字段名及其值,对值执行一些操作并将其存储在目标字典中的适当键名下。
在原始代码中,它是通过将匿名函数作为操作的类似 switch 的长语句来解决的。 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()
...
当然,每个“字段处理程序”函数执行不同的操作并存储在 target_dict 中的不同键中。 因为 Python 不支持带语句的匿名函数(或者我是不是遗漏了什么?)函数必须单独编写,这会降低代码的可读性和不必要的复杂性。
任何关于如何以更优雅和更 pythonic 的方式完成此类任务的提示都将受到赞赏。
谢谢
大卫
最佳答案
如果可能的话,您可以根据字段名称命名您的成员函数,然后执行如下操作:
getattr(self, "fn_" + fieldname)(value)
编辑:您可以使用 hasattr
检查函数是否存在,而不是期待 KeyError。或者期待一个 AttributeError。无论如何,您应该只将访问放在 try..except
中,并在外部调用它,否则在其中一个字段方法中引起的 KeyError 可能会被误解。
关于python - 带有 Action 的基于字典的类开关语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982533/