2012-02-03 4 views
5
def c(): 
    def a(): 
     print dir() 

    def b(): 
     pass 

    a() 

c() 

おそらく本当に簡単な質問ですが、私はグーグルで答えを見つけることはできません。上記のコードがあります。メソッドaとbを含む名前空間を印刷するメソッドが必要です。つまり、呼び出されたポイントフォームの名前空間を印刷します。これは可能ですか?好ましく私はこのようなlocals()となるだろうPythonの2.xのPythonで親の名前空間にアクセスする

+0

私がしようとするだろうグローバル()のpython 3においても –

+1

は、なぜあなたはこれを行うにはしたくない、それを行うための別の方法がありますか? –

+0

私は2つの答えについてのコメントですでに説明しました。基本的に、私たちの学生のオンラインテストアプリケーションの脆弱性を探しています。正しいと思われるので、解決策を見つけるために生徒がテストコードをリバースエンジニアリングするのを防ぐ必要があります。 (もちろん、これを見つけるのに十分な賢い学生は、演習に合格するための十分なスキルを持っているはずです) – nvcleemp

答えて

5

あなたは、Pythonの標準ライブラリからinspectモジュールを使用することができます。

import inspect 

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

    def b(): 
     pass 

    a() 

c() 

しかしframesは、使用後に削除する必要があり、 noteを参照してください。


回答へのコメント。

可能な方法学生のための機能を検査制限する:

import sys 
sys.modules['inspect'] = None 
sys._getframe = None 
+0

悪い考え。これは高価で汚れています –

+0

実際、これは私が恐れていたことを正確に行いました。学生は検査を使用して、練習問題をテストするために使用する機能のソースを印刷できます。ありがとう。今私は可能性のある攻撃を持っており、それを守る方法を見つけることは私に任されています。 – nvcleemp

+0

@nvcleemp、 'inspect'と' sys._getframe'の使用を制限することが可能だと思います。 – reclosedev

2

に:

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

    def b(): 
     pass 

    a(locals()) 

c() 
+0

はい、それは機能しますが、関数の署名を変更することはできません。いわゆる。 (基本的には、私の生徒がオンラインテストアプリケーションで解決策がどのようにチェックされているかを発見するためにどの攻撃を使用するのかを見つけようとしています) – nvcleemp

+0

なぜ生徒のコードをいくつかのコードに混ぜたり注入したりしますか?とても奇妙に見えます。なぜ、モジュールのようにインポートして、関数を定期的に呼び出すのではないでしょうか。あるいは、評価はまだ簡単です。または、RestrictedPythonを本当に安全なものに使用してください。 – Ski

+0

私たちは既存のウェブサイト(spoj.pl)を使用していますが、学生にさらにフィードバックを提供するカスタム裁判官を書いています。これらの裁判官の1人は、生徒のコードを受け取り、それを実行してからdoctestを実行し、生徒にこのdoctestの結果を提供します。私はinspect.getsourceを使うことができると思っていましたが、実行されるコードが生成されるので、そのような方法でソースコードを入手することはできないようです。 – nvcleemp

関連する問題