python - 带有 Action 的基于字典的类开关语句

标签 python design-patterns lua

我对 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/

相关文章:

c# - C# 中的 IObserver 和 IObservable 用于观察者与委托(delegate)、事件

.net - 相互通知模式

utf-8 - Lua string.format 使用 UTF8 字符

python - 使用openCV和numpy进行图像处理。尝试返回没有红色的图像

python - 如何从另一个python文件执行 `if __name__ == "__main_ _"`中的代码

python - 使用python在远程服务器中执行命令

python - python 2.5 的字符串格式

javascript - Node.js 配置文件与 .env 架构实践和构建模式

c - 在lua中写一个函数(包含按位运算)

loops - 如何在 Lua 中的二维表上创建迭代器?