-3

use_this_dict_for_globals(some_dict) と書けるかのように、Python スクリプト内のすべてのグローバルのストレージを変更したいと思います。

それらはすべて「g_」で始まるため、「g_」を「some_dict」に置き換えることができれば。これらすべての変数アクセスを変更するには、これも機能します。私は実際にはこの方法を好みますが、Python では、foo.bar ではなく foo['bar'] のような変数アクセスを使用する必要があるか、または私が何も知らない python クラスのもの (?) が明らかに必要です。

それを行うための迅速で信頼できる方法はありますか?

更新:すべての回答が述べているように、foo.bar = 123 という制限なしで、辞書のようなクラス インスタンスを使用できます。まったく仕方がないと思います。ご協力いただきありがとうございます。

4

3 に答える 3

0

私はすべてをモジュールに分割し、グローバルなものから離れていました。

すべてのグローバル変数を持つ1つのモジュールを用意し、そのインスタンスをそれを必要とする他のモジュールに渡します。

class doSomeThing(object):
    def __init__(self, config):
        self.config = config

    def some_func(self):
        # something
        pass

class Global_Config(object):
    def __init__(self, params):
        # load global information

if __name__ == "__main__":
    # construct the config
    config = Global_Config(some params)
    one = doSomething(config)
    two = doSomethingTwo(config)
    # do stuff with do some work with one and two and config
于 2012-04-25T14:32:40.067 に答える
0

g_var1andという名前のグローバル名前空間に変数がある場合g_var2(ちなみに非常に悪いことです)、次の方法でそれらにアクセスできます。

some_dict = {varname[2:]: var for varname, var in globals().iteritems() if varname.startswith('g_')}

some_dictで始まるすべてのグローバル変数を含む dict を取得しg_ます。でこれらにアクセスできますsome_dict['var1']

ただし、絶対に必要でない限り、これを行わないでください。クラスとモジュール/パッケージを使用します。簡単な例:

class SomeClass(object):
    def __init__(self):
        self.var1 = 'whatever'
        self.var2 = 'whatever also'

c = SomeClass()
print c.var1, c.var2

詳細については、クラスとモジュール (import some_moduleおよびそのようなもの) についてお読みください。

結論:

グローバル変数にプレフィックスを付けないでg_ください。グローバル名前空間で 1 つの辞書を使用し、そこまたは独自のクラスからこれらにアクセスしてください。

幸運を。

于 2012-04-25T14:39:59.653 に答える
0

この「python クラスのもの」を使用して、すべてのグローバル変数を保持する 1 つのオブジェクトを実装できます。これは一般的に良いアプローチだとは思いませんが、意図したことに非常に近いことに注意してください。

スクリプトの開始近くで、クラスを定義し、MyGlobalsそのインスタンスを取得します。

class MyGlobals(object):
    pass
g = MyGlobals()

g次のように、スクリプトの任意の時点でオブジェクトにアクセスできます。

g.foo = "foo"
print g.foo

ただし、コメントに記載されているように、グローバル変数を避けるようにして、OOP をもっと活用できるかどうかを確認してください。

于 2012-04-25T16:03:37.387 に答える