3

コンテキスト: Ren'py ゲームを作成しています。値は Character() です。はい、私はこれがこの文脈の外ではばかげた考えであることを知っています。

クラスのスコープ外に存在するクラス内の入力文字列から変数を作成する必要があります。

class Test:
    def __init__(self):
        self.dict = {} # used elsewhere to give the inputs for the function below.

    def create_global_var(self, variable, value):
        # the equivalent of exec("global {0}; {0} = {1}".format(str(variable), str(value)))
        # other functions in the class that require this.

Test().create_global_var("abc", "123") # hence abc = 123

vars()[]、などを試しましたがglobals()[variable] = value、単に機能しません (何も定義していません)編集:これは私の問題でした。

以下も同様に機能することはわかっていますが、変数を正しいスコープに入れたいです。

setattr(self.__class__, variable, value) # d.abc = 123, now. but incorrect scope.

Pythonで属性やexecを使用せずに、文字列を変数名として使用して、クラス内からグローバルスコープで変数を作成するにはどうすればよいですか?

そして、はい、私は正気をチェックします。

4

2 に答える 2

7

まず最初に、Python で「グローバル」スコープと呼んでいるものは、実際には「モジュール」スコープです (良い面として、グローバル変数を使用することの「悪」を減らします)。

次に、グローバル var を動的に作成するには、モジュール レベルの辞書を使用するよりも優れている理由がまだわかりませんが、次のようにします。

globals()[variable] = value

これにより、現在のモジュールに変数が作成されます。メソッドが呼び出されたモジュールでモジュール変数を作成する必要がある場合は、次を使用して呼び出し元フレームからグローバル ディクショナリを覗くことができます。

from inspect import currentframe
currentframe(1).f_globals[variable] = name

動的な名前で変数を作成することはできるので、これは特に役に立たないように見えますが、動的にアクセスすることはできません (globals ディクショナリを再度使用しない限り)。

テスト例でも、メソッドに文字列を渡す「abc」変数を作成しますが、ハードコードされた「abc」を使用してアクセスする必要があります-言語自体はこれを思いとどまらせるように設計されています(したがって、Javascript との違いは、配列インデックスとオブジェクト属性は交換可能ですが、Python では個別の Mapping オブジェクトがあります)

私の提案は、モジュール レベルの明示的な辞書を使用し、すべての動的変数をキーと値のペアとして作成することです。

names = {}
class Test(object):
    def __init__(self):
        self.dict = {} # used elsewhere to give the inputs for the function below.

    def create_global_var(self, variable, value):
         names[variable] = value

(ちなみに、Pyhton 2では常に「オブジェクト」からクラスを継承します)

于 2012-11-09T15:41:02.437 に答える
2

これに使えますsetattr(__builtins__, 'abc', '123')

これはおそらく設計上の問題であり、設計を再考する必要があることに注意してください。

于 2012-11-09T15:40:13.183 に答える