0

私が理解しているように、pythonにはintsまたはfloatsまたは同様のデータへの参照はありません。それにもかかわらず、私は次のようなことができれば非常に便利な問題に取り組んでいます

a=1
b=2
c=3
ref_dict={'field1':ref_to_var_a,'field2':ref_to_var_b,'field3':ref_to_var_c}

その後

def update(field,value):
   ref_dict[field]=value

したがって、ユーザーが呼び出した場合

update('field2',5)

の値はb5 になります。

これを行う方法はありますか?ありがとう。

アーバナートの有益なコメントと回答に応えて、私が本当にやりたいことは、驚き、驚き、より複雑です。wxPython で GUI を構築しています。多くの TextCtrl コントロールがあり、それぞれが 1 つの変数の値を設定します。もちろん、各コントロールに対して 1 つのメソッドを作成することも、次のような単一のメソッドを作成することもできます。

def handleTextEvent(self,event):
    if (event.GetEventObject() == widget1):
       a=int(event.GetString)
    elif (event.GetEventObject() == widget2):
       b= ....

私がこれが嫌いな理由もわかると思います。次のような短い関数を 1 つだけ実行できればいいのですが。

def handleTextEvent(self,event):
    ref_dict[event.GetEventObject()]=int(event.GetString())

そして、はい、私は wxPython の初心者です。

ありがとう!

4

1 に答える 1

2

これ可能ですが、ほとんどの場合、悪い考えです。

ab、およびcがグローバルであると仮定します。

ref_dict = {'field1': 'a', 'field2': 'b', 'field3': 'c'}
def update(field, value):
    globals()[ref_dict[field]] = value

本当にしたい場合は、「参照ラッパー」を作成することもできます。

class GlobalReference(object):
    def __init__(self, name):
        self.name = name
    def get(self):
        return globals()[self.name]
    def set(self, value):
        globals()[self.name] = value

ref_dict = {'field1': GlobalReference('a'), 'field2': GlobalReference('b')}
def update(field, value):
    ref_dict[field].set(value)

globalsまた、別のモジュールのグローバル、クラス属性、インスタンス属性など、 にないものをラップしたい場合は? さらに参照ラッパー タイプを作成します。

class NamespaceReference(object):
    def __init__(self, namespace, name):
        self.namespace, self.name = namespace, name
    def get(self):
        return getattr(self.namespace, self.name)
    def set(self, value):
        setattr(self.namespace, self.name, value)

ref_dict = {'field1': GlobalReference('a'), 'field2': NamespaceReference('myobj', 'b')}

または、クラスを忘れてセッター関数を格納するだけでもかまいません…</p>


それで、これが悪い考えなら、正しい答えは何ですか?

何をしようとしているのかわからないので、なんとも言えませんが、いくつかの可能性があります。

  • 個別の変数の束ではなく、値でいっぱいの単一のdict変数を使用します。
  • 変数をクラスのインスタンス属性にして、そのクラスのインスタンスを渡します。
  • プレーンなフロート インスタンスの代わりに、変更可能なフロート ホルダー オブジェクトを使用します。

あなたの特定のケースでは、あなたが望むのは2番目のものだと思います。これは標準的なモデル ビュー コントローラーの設計です。または、MVC、model-template-view、またはその他のバリアントが気に入らない場合 (ここではコントローラーは必要ありません)。

モデルは散在するグローバルの集まりであるため、ビューに接続するのは困難です。最も簡単な答えは、モデルをオブジェクトとして表現することです。次に、ビュー (またはそのコントローラー) にこのモデルへの参照を与えます。これは些細なことですが、これで完了です。

于 2013-04-11T23:22:04.967 に答える