为什么调用exec()时会出现语法错误?

0 投票
1 回答
4499 浏览
提问于 2025-04-16 07:16

我有一个问题数据库,其中一些问题需要特别的验证。于是,我在我的模型里添加了一个叫做py_validation的字段。当这些问题被回答时,我通过运行存储在py_validation里的代码来进行验证。当我把代码粘贴到解释器里时,它能正常工作,但当我用exec来执行时,就出现了错误:

Traceback (most recent call last):
  File "<string>", line 2, in <fragment>
invalid syntax: <string>, line 2, pos 31

代码看起来是这样的:

# This code relies on the field type being a char field
if len(value.split('\n')) < 5:
    raise ValidationError(_("You must specify at least 5 widgets, one per line"))
super(CharField, self).validate(value)

我用以下方式调用它:

def do_py_validate(field, value):
    exec field.py_validation

这样在执行时变量的值就在本地作用域里。感觉有点奇怪,明明在解释器里能正常工作的代码,执行时却出问题了。

1 个回答

5

结果发现这个问题有个简单的答案。这个字符串里面有一些\r字符,Python对这些字符不太满意。答案是在我尝试找办法创建一个像文件一样的对象来读取这个字符串时得出的。解决方案是:

def do_py_validate(field, value):
    exec field.py_validation.replace('\r', '')

这几乎和在Whitespace编程一样有趣。

撰写回答