2015-10-11 20 views
6

私はPythonで "週末プロジェクト"としてゲームエンジンを作ろうとしていますが、問題があります。Pythonで変数を使って関数を呼び出す

キーと関数をテキストファイルに入力してキーバインドを宣言できるようにしようとしていますが、そのシートのコードをexecで実行すると関数が実行され、変数を介して関数を呼び出す方法はわかりません。 (また、私はそれがコードを実行したときに、それが機能を実行する必要はありません。)

ここで私はbinds.zdata

for line in bind: 
    try: 
     exec line 
    except: 
     try: 
      error.write(localtime + " : " + "ERROR: Could not bind key from the bind file : " + line) 
     except: 
      pass 

からコードここでバインドのテキストがありますを実行するために使用するコードです。 ZDataはあなたがそれぞれの行の末尾に()を失いたく

_w = Functions.motion.move().forward() 
_a = Functions.motion.move().left() 
_s = Functions.motion.move().back() 
_d = Functions.motion.move().right() 

答えて

6

:今

_w = Functions.motion.move().forward 
_a = Functions.motion.move().left 
_s = Functions.motion.move().back 
_d = Functions.motion.move().right 

よ私は、誰かがそこに任意のコードを置くことができるので、私は「実行」をお勧めしますかわからない

_w() 
+0

それは働いていた、 – Zac

+0

プレイヤーはこの貫通するので、FYI、ごまかすためにこれを使用することができます助けてくれてありがとう機能性は、彼らがイントロスペクションを使用して、プログラム全体のオブジェクトモデルを公開し、彼らが望むしかし、それを使用することができます。または、その部分を書き直すことさえできます。たとえば、スコアを保存する場所を把握できれば、スコアを獲得するためのコードを追加することができます。 – RobertB

+1

しかし、人々は右.. anygameにそれを行うことができますか? – Zac

4

:Uのような、単に括弧を適用することにより、変数を使用して関数を呼び出すことができます。

しかし、ここに問題があります。 _w = Functions.motion.move().forward() 「前進」関数を呼び出し、_wに結果を置きます。 _w = Functions.motion.move().forward 変数 '_w'に関数 'forward'を代入します。

あなたは、私がどうなるのか尋ねたので、私は様々な機能を表すトークンのセットを作成し、(参照:のConfigParser)を彼らは側で設定ファイルをマッピングをやらせるだろう。次に、設定ファイルを解析します。これはもう少し仕事ですが、はるかに安全です。

+0

コードを実行するためにどのように使用すべきですか? @RobertB – Zac

2

execでそのような設定を読むことは、あなたが信頼している実行可能なコードになるため、実行時にすべての種類の痛みにあなたを開きます。悪意のある、または誤って不正なコマンドが実行されます。彼らは、変数のそれぞれに機能を割り当てるように、私が最初にこのようなbinds.zdataファイルの行を変更したい

def read_config(config_file): 

    user_button_map = {} 
    with open(config_file, 'r') as fh: 
     for line in fh.readlines(): 
      key,func_key = line.strip().split(',')     

      assert(key in BUTTON_MAP_FUNCTIONS),"no such action" 
      user_button_map[key] = BUTTON_MAP_FUNCTIONS[func_key] 

    return user_button_map 


BUTTON_MAP_FUNCTIONS = { 
    "forward" : Functions.motion.move().forward, 
    "left" : Functions.motion.move().left, 
    # etc... 
} 

# sample config file 
# w, forward 
# a, left 
# etc... 
+0

私の考えと同様に、私はConfigParserをチェックすることでこれを改善します。 – RobertB

+0

が合意した、configparserや別の設定管理ツールもここで良いだろう – tlastowka

3

_w = Functions.motion.move().forward 
_a = Functions.motion.move().left 
_s = Functions.motion.move().back 
_d = Functions.motion.move().right 

次に、仮定あなたはこのようにそれをテンプレートができ、_w_a、その後

try: 
    execfile('binds.zdata') 
except Exception as exc: 
    error.write(localtime + " : " + "ERROR: executing binds file") 

Functionsが定義されていることを、私のようなもので、一度ファイル内のすべての行を実行したいです、_d変数は、いつものように呼び出すことができ、それらに割り当てられた所望の機能を持つことになります - すなわち_w()_a()を、など

関連する問題