1

キーボード入力を処理し、適切な関数を実行するメソッドを作成しようとしました (オプションでいくつかの引数を使用)。したがって、次のようないくつかのキーボードマッピングでdictを使用しています

mappings = {
    'q'      : (quit         , None),
    KEY_HOME : (move_to_line , 1),
    KEY_END  : (move_to_line , widget.last_line)
}

ハンドラー関数自体は次のようになります。

def handle_input(user_input):

    if user_input in mappings.keys():
        func = mappings[user_input][0]
        args = mappings[user_input][1]
        if args == None:
            func()
        elif type(args) == list:
            func(*args)
        elif type(args) == dict:
            func(**args)
        else:
            func(args)

これで、関数は最初の 2 つの dict エントリに対して適切に機能します。3回目のエントリーの場合、widget.last_line変更すると動作しません。これはウィジェットのプロパティですが、Python コンパイラはこのエントリを定数値として処理しているようです。そのようなエントリを「揮発性」に保つ方法はありますか、またはそのような操作を実行するためのより良い方法はありますか?

4

3 に答える 3

2

属性への参照を思い通りに保存する方法はありません。代わりにできることは、呼び出されたときに属性をフェッチし、その時点で値をに渡す新しい関数を作成することですmove_to_line

KEY_END  : (lambda: move_to_line(widget.last_line), None)
于 2014-06-17T05:11:08.550 に答える
1

これに関する最後のエントリを変更します。KEY_END : (move_to_last_line , widget)

どこmove_to_last_lineにある:

def move_to_last_line(widget):
  move_to_line(widget.last_line)
于 2014-06-17T05:10:45.127 に答える
0

物件であっても物件の価値は変わってくると思います。これを考慮してください: class Person: name p = Person('Mike') dict[p.name] = something

p.name を 'Joe' に変更すると、辞書のマッピングが魔法のように dict['Joe'] に変更されると思いますか?

于 2014-06-17T05:03:33.370 に答える