如何为Python函数设置函数环境?

2024-10-05 13:24:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在Lua中,有一个名为setfenv()的内置函数,它允许您提供一个变量表作为函数的环境。下面是一个使用它的示例:

foo = 1
function f()
    print(blech) --Note that no variable named blech has been defined.
end
variableTable = {blech = foo}
setfenv(f, variableTable)
f() -- This will work and print 1, because blech has been defined as foo's value in the variableTable

我这样做的动机是,它允许我建立一个平台,这样用户就可以在Lua中编写易于理解的脚本(他们可以编写空函数,并且可以简单地相信变量会为他们而存在)。它还提供了一种优雅的方法来排除出于安全原因我不希望它们使用的模块和函数(例如,如果您定义了一个没有定义os模块的变量表,那么知识更丰富的用户就不可能恶意地使用它)。在

我希望能够在Python中实现同样的功能。在Python中有类似的方法吗?在


Tags: 模块方法函数用户定义foo内置has
3条回答

exec

def foo():
    print bar

exec foo.func_code in {"bar": "baz"}

这不是特别好的风格(我甚至可以说它特别糟糕)。这使得foo的实现很难理解,因为它依赖于知道调用它的特殊方式。相反,将参数传递给函数。在

这并不能提供任何安全措施。首先,Python不包含任何受限的执行功能。没有什么可以阻止用户提供foo的定义:

^{pr2}$

仅仅因为您没有在映射中提供os,并不意味着他们不能自己去获得它。如果您真的需要限制执行,那么您可能希望继续使用Lua,或者至少调查一下PyPy sandboxed mode。在

我不知道你为什么要这么做,但这里有一个老生常谈的方法:

def foo():
    print bar
foo.func_globals['bar'] = 1
foo()

警告:我不建议这样做。在

你为什么要这么做?你的代码是否变得可读性太强了?
只需将带有“env”的dict或struct传递给函数。在

编辑:阅读你的动机。第一部分我无法理解(用python编写lua脚本?什么意思?),第二个显然是错误的。这不是限制环境的方法。首先,你仍然可以import os
限制执行有点复杂。我知道的一些事情:

  1. Python受限模块-http://docs.python.org/library/restricted.html。已弃用。在
  2. 过时的wiki页面-http://wiki.python.org/moin/SandboxedPython。没有什么特别有用的。在
  3. 皮比。这可能是该走的路。PyPy沙盒文档:http://codespeak.net/pypy/dist/pypy/doc/sandbox.html

相关问题 更多 >

    热门问题