exec:SyntaxError:'return'外部函数

时间:2017-09-27 16:59:53

标签: python python-2.7

我在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

1 个答案:

答案 0 :(得分:0)

the exec docs

  

请注意,即使在传递给return语句的代码的上下文中,yieldexec语句也不能在函数定义之外使用。

所以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)