2012-02-11 10 views
0

私はPythonスクリプトで次のいますGetAttrの機能の問題(Pythonの3)

setattr(stringRESULTS, "b", b) 

私に次のエラーを与える:

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

はどの-1は、問題が何であるかを私に告げることができますここに?

+0

エラーメッセージがかなり明確ようです...あなたの問題は何ですか? – delnan

+0

私はこのように動作する動的変数を作りたいと思っています: (文字列は変数STRINGRESULTSに含まれています)。b =(変数bに含まれる文字列) setattrで使用できると言われているもの:[リンク](http://docs.python.org/py3k/library/functions.html#setattr) 私はそれがPythonのdocの結果でエラーを起こしていると言います。 –

+0

@EdenCrow:stringRESULTSオブジェクトに "b"という属性を追加しようとしているか、stringRESULTSの内容で*指定されたオブジェクトにbという属性を追加しようとしていますか?if stringRESULTSは文字列 "fred"で、bは7だったので、 "fred.b = 7"と同等の処理を動的に実行したいでしょうか? – DSM

答えて

3

これを行わないでください。計り知れないGreg Hewgillを引用すると、

"If you ever find yourself using quoted names to refer to variables, there's usually a better way to do whatever you're trying to do."

は、[ここでは、1つの上のレベルアップと名前の文字列変数を使用しているが、それは同じ根本的な問題だ。]またはS.ロットは同じスレッドにしてフォローアップとして、 :あなたがsetattrにしたいいくつかのオブジェクトfredへのポインタとしてstringRESULTSの内容を使用している場合

"90% of the time, you should be using a dictionary. The other 10% of the time, you need to stop what you're doing entirely."

、次にターゲティングするこれらのオブジェクトは、すでにどこかに存在している必要があり、そしてa dictionaryはに自然なデータ構造であり、それらを保管する。実際、ユースケースによっては、最初に属性の代わりに辞書のキーと値のペアを使用できる場合があります。

IOW、あなたがしようとしている(私は推測している)ものの私のバージョンは、おそらく私が仕事に必要な/望んでいたかどうかに応じて

d[stringRESULTS].b = b 

または

d[stringRESULTS]["b"] = b 

ようになります。オブジェクトのインスタンスや辞書で十分です。

(PS比較的少数の人々のpython-3.xのタグに加入。あなたは通常、同様裸「のpython」タグを追加することによって、より多くの注目を取得します。)

+0

Re:tags - あなたの問題がPythonのバージョンXに固有のものである場合、 'python-X'タグを使います。それが一般的であれば、DSMが示唆するように 'python'を使います。 – Daenyth

+0

OK。私は辞書を使用して、将来の質問でpythonタグを使用するように見ていきます - ありがとう! –

0

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

あなたが期待するように振る舞うべき
class StringResult(str): 
    pass 

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

はEDIT:

あなたがしようとしている場合何がDSMが提案します。これは、トリックを行う必要がありstringRESULTS変数の値と同じ名前を持つ変数のプロパティを変更します。

locals()[stringRESULTS].b = b 

これは非常に危険な動作上の大混乱のすべての種類をwreakできることに注意してくださいあなたが気をつけなければあなたのアプリ。