3

ほとんどの人はおそらくこれは悪い考えだと言うでしょう。文字列の内容を変数の名前として使用したい。私は恐ろしいことを達成したい:

s = 'x'
x = 1

変数名xは(どういうわけか?)文字列から来ていますs

「なぜ?」に答えるためxに、関数でオーバーライドするオプションが必要なグローバルデフォルト値があるとします。だが:

x = 0
def f(**kw):
    print x
f(x=1)

印刷し0ない1。kw.keys()の文字列を使用してx(または他のグローバルに設定された変数を)再割り当てできれば幸いです。

x私はこれが再割り当てのために働くことを理解していますf

x = 0
def f(x=x):
    print x
f(x=1)

しかし、名前空間に多くの変数があり、モジュール内のすべての関数定義を書き直さずにオーバーライドしたい場合に、これを実行したいと思います。

4

6 に答える 6

5

execをチェックしてください

>>> print x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> s = 'x'
>>> exec(s + " = 1")
>>> print x
1 

参照:Pythonでevalを使用して変数の値を割り当てるにはどうすればよいですか?

少し実験した後、これもうまくいくようです:

>>> print x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> s = 'x'
>>> globals()[s] = 1
>>> print x
1
于 2013-02-08T01:13:40.700 に答える
1

関数の引数による割り当ては明らかではないため、Pythonicとは見なされません(PythonはCではありません)。を参照してくださいimport this

私がフラット構成を行った安価な方法は、グローバルな部分的なdictを使用することです。

In [1]: from functools import partial
In [2]: config = partial(dict)
In [3]: def f(x=None):
   ...:     print x or config.x
   ...:     
In [4]: config.x = 'foo'
In [5]: f()
foo

この効果の何か明白で、読みやすく、したがってはるかに保守しやすいです。

于 2013-02-08T01:27:45.653 に答える
1

しかし、名前空間に多くの変数があり、モジュール内のすべての関数定義を書き直さずにオーバーライドしたい場合に、これを実行したいと思います。

クラスが必要なようです。

class Foo(object):
    x = 0
    def f(self):
        print self.x

my_foo = Foo()
my_foo.x = 1
my_foo.f()
于 2013-02-08T01:31:21.693 に答える
1

globalキーワードの使用を再検討する必要があります( http://docs.python.org/2.7/reference/simple_stmts.html#the-global-statement )

Use of "global" keyword in Pythonもご覧になることをお勧めします。

また、promanow が示唆したように、グローバルな可変オブジェクトを使用する方がより良いアプローチかもしれません。

ただし、メンテナンスの観点から、変化するグローバルに変更または依存する可能性のある大量のコードを持つことは非常に恐ろしい考えであることに注意してください。慎重に踏みます。

于 2013-02-08T01:23:15.547 に答える