Python exec:SyntaxError:函数外部的“return”

Python exec:SyntaxError:函数外部的“return”,python,python-2.7,Python,Python 2.7,我将代码片段存储在Postgres数据库中。当我需要代码时,我会在DB中找到它并使用exec函数。代码段是提取函数的主体 不幸的是,它在函数外部返回SyntaxError:“return” 方法 代码段reprcode_代码段 u"return response.xpath('/text()')" 我想应该是这样的: def extract(self,response): return response.xpath('/text()') 我该怎么办? 这只是一行代码段,我需要执行多行

我将代码片段存储在Postgres数据库中。当我需要代码时,我会在DB中找到它并使用exec函数。代码段是提取函数的主体

不幸的是,它在函数外部返回SyntaxError:“return”

方法

代码段reprcode_代码段

u"return response.xpath('/text()')"
我想应该是这样的:

def extract(self,response):
    return response.xpath('/text()')
我该怎么办? 这只是一行代码段,我需要执行多行代码段

编辑:

我将Django与PostgreSQL一起使用,我意识到它会在行缩进的开头去掉空格。我不知道这是否与问题有关

编辑2:

尝试了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
Per:

请注意,return和yield语句不能在函数定义之外使用,甚至不能在传递给exec语句的代码上下文中使用

所以exec是明确禁止的。该措辞是全球性的,而不是针对exec;在检查时,使用“single”模式编译的代码进行评估时,会出现相同的错误;不能像这样动态插入return语句

如果您绝对必须允许执行任意代码,我强烈建议将其限制为表达式,而不是语句,并隐式返回所述表达式的结果。因此,不存储ureturn response.xpath'/text',而是存储ureresponse.xpath'/text',执行动态调用的代码将更改为:

def extract(self,response):
    return eval(self.custom_code)

@MilanoSlesarik,当你使用eval时,不要在字符串中放一个返回值。也就是说,戴上我的安全帽,将代码存储在数据库中,除非它在运行时被有效地沙盒,Python不支持沙盒,这是一个可怕、可怕的想法——这意味着任何对你的数据存储的破坏都是对你的应用服务器的破坏。这还意味着上述代码不能提前进行字节编译,而且即使您切换到支持JIT优化的解释器(如PyPy),您也不会从中受益,因此您也会受到性能损失。为什么要将代码存储在db中?别那么做,你决定错了。数据库用于数据,而不是逻辑。因此,找出数据的本质,例如URL,每个不同解析技术的不同标记,然后存储/检索它们。你不必处理这些疯狂的语法错误和范围问题。@MilanoSlesarik:你会惊讶于你在一个表达式中能做多少事情;如果您确实必须这样做,您可能需要通过一些扭曲来将语句或块重写为表达式,但几乎总是可以做到的。
def extract(self,response):
    return eval(self.custom_code)