如何解决如何设置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中编写易于理解的脚本(他们可以编写null函数,并且可以简单地相信变量将在其中存在)。它还提供了一种优雅的方法来排除出于安全原因不希望它们使用的模块和函数(例如,如果您定义的变量表未定义os模块,则无法知识渊博的用户可能会恶意使用它)。
我希望能够在Python中实现相同的目的。在Python中可以做类似的事情吗?
解决方法
exec
:
def foo():
print bar
exec foo.func_code in {\"bar\": \"baz\"}
这不是特别好的样式(我什至会说它特别糟糕)。由于难以理解will4的调用方式,因此难以理解。而是将参数传递给函数。
这不提供任何安全措施。作为第一近似,Python不包含任何受限制的执行功能。没有什么可以阻止用户提供foo的以下定义:
def foo():
import os
os.system(\"rm -rf /\")
仅仅因为您未在映射中提供os
并不表示他们自己也无法获取。如果您确实需要限制执行,那么您可能要坚持使用Lua,或者至少研究PyPy沙盒模式。
,我不确定为什么要这样做,但是这是一种骇人听闻的方法:
def foo():
print bar
foo.func_globals[\'bar\'] = 1
foo()
警告:我不建议这样做。
,你为什么要这么做?您的代码变得太易读了吗?
只需将带有\ env的字典或结构传递给函数即可。
编辑:阅读你的动机。第一部分我听不懂(用python编写lua脚本?这是什么意思?),第二部分是完全错误的。这不是限制环境的方法。一个,你仍然可以import os
。
限制执行有点复杂。我知道一些东西:
Python受限制的模块-http://docs.python.org/library/restricted.html。不推荐使用。
Wiki页面已过时-http://wiki.python.org/moin/SandboxedPython。那里没有任何疯狂的用处。
PyPy。这可能是要走的路。 PyPy沙箱文档:http://codespeak.net/pypy/dist/pypy/doc/sandbox.html
,我不知道有什么明智的方法。只需使用函数参数即可。
def f(blech):
print(blech)
如果您希望它具有许多变量,请将其贴在dict
中并将其传递。
def f(vars):
print(vars[\'blech\'])
print(vars[\'fizz\'])
,您可以让函数采用一个额外的值,该值是关键字参数的一滴:
def printKeyValuePairs(preface,**kwargs):
print preface + \"\\n\"
for k,v in kwargs.iteritems():
print k + \": \" + v + \"\\n\"
# usage
printKeyValuePairs(\"Here are my key-value pairs:\",One=1,Two=2,Three=3)
# prints:
# Here are my key-value pairs:
# One: 1
# Two: 2
# Three: 3
# (note that the above lines could be ordered any which way... might want to
# sort first if it matters)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。