2

描画プログラム(Pythonでpygameを使用して記述)のユーザーが選択したオブジェクトの名前を変更できるようにし、ライブインタープリターを介してそれらのオブジェクトに名前でアクセスできるようにしようとしています。以下は、すべての描画可能なオブジェクトの基本クラスのメソッドです。このコードを実行してもエラーは発生しませんが、新しい名前でオブジェクトにアクセスしようとすると、その名前の変数が定義されていないと言われます。なぜこれが起こるのか、何か考えはありますか?

def rename(self,newName):

    """
    Gives this drawable a new name by which the user my reference it in
    code
    """

    #Create a new variable in the global scope
    command =  'global ' + newName + '\n'

    #Tie it to me
    command += newName + ' = self' + '\n'

    #If I already had a name, I'll remove this reference
    if self.name != None:
        command += 'del ' + self.name

    #Execute the command
    exec(command)

    #Make this adjustment internally
    self.name = newName
4

1 に答える 1

2

exec関数には、関数に表示されるものとは関係なく、独自のグローバル変数の結合があるため、これは機能しないと思います。

一般的に言えば、モジュールの辞書を操作する方が簡単です。グローバルスコープは、実際には現在のモジュールのメンバー名であることに注意してください。

たとえば、__main__モジュールを使用している場合、変数を追加するには、次のようにします。

sys.modules['__main__'].__setattr__('xxx', 42)

そしてそれを削除するには:

sys.modules['__main__'].__delattr__('xxx')

更新:考え直してみると、モジュールを気にしない場合は、globals()辞書を使用する方が良いでしょう。変数を追加するには:

globals()['xxx'] = 42

そしてそれを削除するには:

del globals()['xxx']

globals()当然、 ()のようなものを返すため、前者と同等sys.modules[__name__].__dict__です。

気の利いた。結論は次のとおりですeval。リフレクションを行うために使用する場合、それは間違っています。

于 2012-10-29T17:44:32.493 に答える