Skip to main content
 首页 » 编程设计

python之如何为 Python 函数设置函数环境

2025年05月04日11lori

在 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 中编写易于理解的脚本(他们可以编写 nullary 函数并且可以简单地相信变量会在那里)。它还提供了一种优雅的方法来排除出于安全原因我不希望它们使用的模块和函数(例如,如果您定义了一个没有定义 os 模块的变量表,那么知识渊博的用户就无法使用它是恶意的)。

我希望能够在 Python 中实现同样的事情。有没有类似的东西可以用 Python 完成?

请您参考如下方法:

有exec:

def foo(): 
    print bar 
 
exec foo.func_code in {"bar": "baz"} 

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

这不提供任何安全措施。作为第一个近似值,Python 不包含任何受限的执行功能。没有什么能阻止用户改为提供 foo 的定义:

def foo(): 
    import os 
    os.system("rm -rf /") 

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