我如何为Python函数设置函数环境?
在 Lua 中,有一个名为 setfenv()
的内置函数,它允许您为函数提供一些变量表,作为其环境。以下是一个使用它的示例:
foo = 1
def f():
print(blech) #注意,没有一个名为 blech 的变量被定义。
variableTable = { 'blech': foo }
f.__globals__.update(variableTable)
f() #这能够正常工作并打印 1,因为blech已经被定义为变量表中foo的值
我这样做的动机是让用户能够在 Lua 中编写易于理解的脚本(他们可以编写 nullary 函数,可以简单地信任变量会出现在它们的脚本中)。它还提供了一种优雅的方法,可以排除我不希望他们出于安全原因使用的模块和函数(例如,如果您定义了一个不包含操作系统模块的变量表,更知识渊博的用户就无法恶意地使用它)。
我想在 Python 中能够实现相同的功能。Python 中是否有类似的功能?
原文链接 https://stackoverflow.com/questions/6143994
这里有一个 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 沙盒模式。
我不确定你为什么想这样做,但是这里有一种hacky的方法:
def foo():
print bar
foo.func_globals['bar'] = 1
foo()
注意:不建议这样做。
为什么你要这么做呢?是因为你的代码变得太简单易读了吗?
只需将一个带有你的“env”(环境)的字典或一个结构体传递给函数即可。
编辑:阅读了你的动机。第一部分我无法理解(用Python编写lua脚本?那是什么意思?),第二部分是完全错误的。这不是限制环境的方式。首先,你仍然可以import os
。
受限执行是一个有点复杂的主题。这是我所知道的一些东西:
- Python 受限模块 - http://docs.python.org/library/restricted.html。已不推荐使用。
- 一个过时的维基页面 - http://wiki.python.org/moin/SandboxedPython。那里没有非常有用的信息。
- PyPy。这可能是正确的方法。PyPy 沙盒文档:http://codespeak.net/pypy/dist/pypy/doc/sandbox.html。
你可以让你的函数接受一个额外的值,这个值是一堆关键字参数:
def printKeyValuePairs(preface, **kwargs):
print preface + "\n"
for k,v in kwargs.iteritems():
print k + ": " + v + "\n"
# 使用示例
printKeyValuePairs("这是我的键值对:", One=1, Two=2, Three=3)
# 输出结果:
# 这是我的键值对:
# One: 1
# Two: 2
# Three: 3
# (注意,这些行的顺序可以任意排列......如果这很重要,可能要先进行排序)
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我不知道有什么正常的方法来做到那一点。只需使用函数参数。
def f(blech): print(blech)
如果你想要它有很多变量,把它们放在一个
dict
中,并传递它。def f(vars): print(vars['blech']) print(vars['fizz'])