在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
Run Code Online (Sandbox Code Playgroud)
我这样做的动机是它允许我建立一个平台,以便用户可以在Lua中编写易于理解的脚本(他们可以编写Nullary函数,并且可以简单地相信变量将存在于他们身上).它还提供了一种优雅的方法来排除我不希望它们出于安全原因使用的模块和函数(例如,如果你定义一个没有定义os模块的变量表,那么一个知识渊博的用户就无法使用它恶意).
我希望能够在Python中实现同样的功能.是否有类似的东西可以在Python中完成?
有exec:
def foo():
print bar
exec foo.func_code in {"bar": "baz"}
Run Code Online (Sandbox Code Playgroud)
这不是特别好的风格(我甚至会说它特别糟糕).它使实现foo难以理解,因为它依赖于了解它的特殊方式.而是将参数传递给函数.
这不提供任何安全措施.作为第一个近似值,Python不包含任何受限执行功能.没有什么能阻止用户提供foo的这个定义:
def foo():
import os
os.system("rm -rf /")
Run Code Online (Sandbox Code Playgroud)
仅仅因为你没有os在映射中提供并不意味着他们不能自己去获取它.如果你真的需要限制执行,那么你可能想要坚持Lua,或至少调查PyPy沙盒模式.