Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中访问父命名空间_Python - Fatal编程技术网

在python中访问父命名空间

在python中访问父命名空间,python,Python,可能是一个非常简单的问题,但我似乎无法通过谷歌搜索找到答案。我有上面的代码,我希望a方法打印包含方法a和b的名称空间,也就是说,我希望它打印它所调用的点形式的名称空间。这可能吗?最好是在Python 2.x中,我会这样说: def c(): def a(): print dir() def b(): pass a() c() 您可以使用标准Python库中的模块: def c(): def a(locals_):

可能是一个非常简单的问题,但我似乎无法通过谷歌搜索找到答案。我有上面的代码,我希望a方法打印包含方法a和b的名称空间,也就是说,我希望它打印它所调用的点形式的名称空间。这可能吗?最好是在Python 2.x中,我会这样说:

def c():
    def a():
        print dir()

    def b():
        pass

    a()

c()
您可以使用标准Python库中的模块:

def c():
    def a(locals_):
        print locals_

    def b():
        pass

    a( locals() )

c()
但使用后应删除
,请参阅


回答评论

限制学生检查功能的可能方式:

import inspect

def c():
    def a():
        frame = inspect.currentframe()
        print frame.f_back.f_locals

    def b():
        pass

    a()

c()

我会尝试python 3中的globals(),还有另外一种方法,我已经在对这两个答案的评论中解释过:基本上,我是在为我们的学生寻找在线测试应用程序中的漏洞。似乎是正确的,我们需要防止学生对测试代码进行反向工程以找到解决方案。(当然,任何足够聪明的学生也应该有足够的技能通过练习)是的,那会起作用,但我不能更改函数a的签名,也不能更改调用它的点。(基本上,我试图找出我的学生可以使用哪些攻击来发现如何在我们的在线测试应用程序中检查解决方案)为什么你要将学生代码与你的一些代码混合/注入。。?看起来很奇怪。为什么不像模块一样导入并定期调用函数呢。或者eval,听起来更简单。我们使用一个现有的网站(spoj.pl),但编写了一些自定义判断,为我们的学生提供更多反馈。其中一位评委获取学生代码,运行代码,然后运行博士测试,并向学生提供该博士测试的结果。我似乎太早了一点:我以为他们可以使用inspect.getsource,但由于执行的代码是生成的,所以似乎不可能以这种方式获得源代码。这是个坏主意。这既昂贵又肮脏事实上,这正是我所担心的:学生可以使用inspect打印我们用来测试他们练习的函数源。谢谢现在我有一个可能的攻击,这取决于我找到一种方法来防止攻击it@nvcleemp,我认为可以限制
inspect
sys.\u getframe
的使用。谢谢,我认为我们不会在他们需要inspect或sys.\u getframe的地方给他们做练习,所以只需覆盖它们,似乎是一个合理的解决方案。@nvcleemp我认为你最好的选择是。
import sys
sys.modules['inspect'] = None
sys._getframe = None