我在Postgres DB中存储代码片段。当我需要代码时,我在数据库中找到它并使用exec()
函数。代码段是extract
函数的主体。
不幸的是,它会返回SyntaxError: 'return' outside function
方式
def extract(self,response):
exec(self.custom_code)
代码段(repr(code_snippet))
u"return response.xpath('/text()')"
我认为它的行为应该是这样的:
def extract(self,response):
return response.xpath('/text()')
我该怎么办? 这只是一个行代码片段,我需要执行多行代码段。
修改
我正在使用Django和PostgreSQL,我意识到它在行的开头删除了空格 - 缩进。我不知道它是否必须解决这个问题。
EDIT2:
尝试eval而不是exec。现在它提出了:
File "/home/milano/PycharmProjects/Stilio_project/stilio/engine/models.py", line 107, in extract
eval(self.custom_code)
File "<string>", line 1
return response.xpath('/text()')
^
SyntaxError: invalid syntax
答案 0 :(得分:0)
请注意,即使在传递给
return
语句的代码的上下文中,yield
和exec
语句也不能在函数定义之外使用。
所以exec
显然是禁止的。这个措辞是全球性的,不是exec
所特有的;在检查时,eval
使用代码compile
- 'single'
模式下的ed具有相同的错误;你不能像这样动态插入return
语句。
如果绝对必须允许执行任意代码,我强烈建议将其限制为表达式,而不是语句,并隐式返回所述表达式的结果。因此,不是存储u"return response.xpath('/text()')"
,而是存储u"response.xpath('/text()')"
,而执行动态调用的代码将更改为:
def extract(self,response):
return eval(self.custom_code)