【发布时间】:2014-10-10 05:25:11
【问题描述】:
我正在用 python 编写一个预处理器,其中一部分与 AST 配合使用。
有一个render() 方法负责将各种语句转换为源代码。
现在,我有这样的(缩短的):
def render(self, s):
""" Render a statement by type. """
# code block (used in structures)
if isinstance(s, S_Block):
# delegate to private method that does the work
return self._render_block(s)
# empty statement
if isinstance(s, S_Empty):
return self._render_empty(s)
# a function declaration
if isinstance(s, S_Function):
return self._render_function(s)
# ...
如你所见,它很乏味,容易出错,而且代码很长(我有更多种类的语句)。
理想的解决方案是(在 Java 语法中):
String render(S_Block s)
{
// render block
}
String render(S_Empty s)
{
// render empty statement
}
String render(S_Function s)
{
// render function statement
}
// ...
当然,python 不能这样做,因为它有动态类型。当我搜索如何模仿方法重载时,所有答案都只是说“你不想在 python 中这样做”。我想在某些情况下确实如此,但这里kwargs 真的一点用处都没有。
如果类型检查 ifs 没有可怕的千米长序列,我将如何在 python 中执行此操作,如上所示?另外,最好是“pythonic”的方式来做到这一点?
注意:可以有多个“渲染器”实现,它们以不同的方式渲染语句。因此,我不能将渲染代码移动到语句中,只需调用s.render()。必须在渲染器类中完成。
(我找到了一些interesting "visitor" code,但我不确定它是否真的是我想要的东西)。
【问题讨论】:
-
查看this question 的答案。这个在技术上是重复的,但它收到了一些不同的答案,所以我犹豫要不要举报它。
标签: python oop design-patterns