0

Pythonスクリプトには次のものがあります。

setattr(stringRESULTS, "b", b)

これにより、次のエラーが発生します。

AttributeError: 'str' object has no attribute 'b'

誰かがここで何が問題なのか教えてもらえますか?

4

2 に答える 2

3

これをしないでください。計り知れないグレッグ・ヒューギルを引用すると、

「引用符で囲まれた名前を使用して変数を参照していることに気付いた場合は、通常、実行しようとしていることをすべて実行するためのより良い方法があります。」

[ここでは、1つ上のレベルで、名前に文字列変数を使用していますが、根本的な問題は同じです。]または、S。Lottが同じスレッドでフォローアップした場合:

「90%の時間は辞書を使用する必要があります。残りの10%の時間は、実行していることを完全に停止する必要があります。」

stringRESULTSの内容を目的のオブジェクトへのポインターとして使用している場合、ターゲットにするこれらのオブジェクトはすでにどこかに存在している必要がありfredディクショナリはそれらを格納するための自然なデータ構造です。実際、ユースケースによっては、そもそも属性の代わりに辞書のキーと値のペアを使用できる場合があります。setattr

IOW、あなたがやろうとしていることの私のバージョンはおそらく次のようになります

d[stringRESULTS].b = b

また

d[stringRESULTS]["b"] = b

オブジェクトインスタンスまたはディクショナリを操作する必要があるかどうかに応じて、十分です。

(PS比較的少数の人がpython-3.xタグをサブスクライブします。通常、裸の「python」タグも追加することで、より多くの注目を集めることができます。)

于 2012-02-11T17:12:46.367 に答える
0

strは低レベルのプリミティブ型であるため、実際には任意の属性を設定することはできません。おそらくdictまたはstrのサブクラスのいずれかが必要です:

class StringResult(str):
    pass

これは期待どおりに動作するはずです:

my_string_result = StringResult("spam_and_eggs")
my_string_result.b = b

編集:

DSMが提案することを実行しようとしている場合、つまり。変数の値と同じ名前の変数のプロパティを変更すると、次のようになりstringRESULTSます。

locals()[stringRESULTS].b = b

これは非常に危険な操作であり、注意しないとアプリにあらゆる種類の大混乱をもたらす可能性があることに注意してください。

于 2012-02-11T15:32:46.417 に答える