通常有更清晰,更直接的方法来获得相同的效果。如果构建复杂的字符串并将其传递给
exec,则代码将难以遵循且难以测试。
示例:我编写了读取字符串键和值并在对象中设置相应字段的代码。它看起来像这样:
for key, val in values: fieldName = valueToFieldName[key] fieldType = fieldNameToType[fieldName] if fieldType is int: s = 'object.%s = int(%s)' % (fieldName, fieldType) #Many clauses like this...exec(s)
对于简单的情况,该代码并不可怕,但是随着新类型的出现,它变得越来越复杂。当有错误时,它们总是在调用exec时触发,因此堆栈跟踪并没有帮助我找到它们。最终,我切换到了一个稍长,不太聪明的版本,该版本明确设置了每个字段。
代码清晰的第一条规则是,仅查看代码的每一行,应易于理解。这就是为什么不建议goto和global变量的原因。exec和eval可以很容易地严重破坏该规则。



