2012-04-25 8 views
-3

pythonスクリプトですべてのグローバルの記憶域を変更したいのですが、あたかもuse_this_dict_for_globals(some_dict)を書くことができるかのようです。Pythonでグローバルの記憶域を変更する

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

すばやく/信頼できる方法はありますか?

更新:すべての回答として、辞書などのクラスインスタンスを使用できますテーブルを持っている)、私には全く方法がないと思うように導く。ご協力いただきありがとうございます。

+2

「私が何も知らないPythonクラスのもの」?真剣に、それを学ぶ。 Pythonは厳密なOO言語ではありませんが、少なくともPythonのOOPの基礎を理解することはありません。 –

+0

'globals()'はあなたが望むものですか? 「彼らはすべて接頭辞がg_ですか?」とはどういう意味ですか? – jadkik94

+0

@ Daniel Roseman [OK]、この非特異的で正直な答えに感謝します。 – user1356442

答えて

0

この「python class stuff」を使用して、すべてのグローバル変数を保持する1つのオブジェクトを実装できます。私はこれが一般的に良いアプローチだとは思っていませんが、あなたがやろうとしていたことに非常に近いものです。あなたのスクリプトの先頭近く

、クラスMyGlobalsを定義し、そのインスタンスを取得します:

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

あなたはこのようなあなたのスクリプトで任意のポイントでオブジェクトgにアクセスできます。

g.foo = "foo" 
print g.foo 

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

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 
+0

グローバルな状態を避けることは涼しいですが、あなた自身をだますことはありません:どこにでも渡すと、それはまだグローバルです。あなたが得た唯一のものは、何か違うものを渡す*オプション*です。あなたはそのオプションを使わなければいけません。 – delnan

0

あなたは(経由で非常に悪い)g_var1g_var2という名前のグローバル名前空間内の変数を持っている場合は、あなたがそれらにアクセスすることができます:あなたはとのdict some_dictを取得します

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

すべてグローバル変数は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つの辞書を使用して、そこからか、独自のクラスこれらはアクセスしないでください。

幸運。

+0

この問題には名前接頭辞は関係ありませんか?私は本当にグローバル辞書を使用したいと思いますが、テキストエディタは通常barをfoo ['bar']に変更することをサポートしていません。だから、foo.barのようなドット表記法は私が一般的に好むものです。しかし、この表記法/演算子は、PythonのOOP部分だけに保存​​されているようです。ストレージクラスの問題のためにOOPを使用していますか?私は少しこの考えを嫌う。ですから、最後に変数のグループ化にfoo ['bar']表記法を使わなければなりません。あなたの助けをありがとう。私がOOPを必要としているかどうかを確かめる前に、今私は知っています。 – user1356442

+0

私はあなたの意見を持っています。クラスが必要な場合はクラスをclass A(オブジェクト):pass'と定義し、 'a_instance.var1 = something'を使用してdictの代わりに必要なものを取得し、変数名が何であるか知っていれば(動的)、どんなオブジェクトでも 'setattr'と' getattr'を使うことができます... – jadkik94

+0

私はもう一度それを読んで、プレフィックスは変数とsome_dict = ...コードスニペットのようにアクセスしてください。 – user1356442

関連する問題