2

これはおそらく非常に基本的で単純なものであり、おそらく間違った用語をグーグル検索しているだけですが、ここの誰かが私を助けてくれることを願っています. (私はまだプログラミングの初心者です。これはおそらくこの質問から明らかです。)

文字列から変数にアクセスする方法を探しています。

このような:

A1 = {}
B1 = {}
C1 = {}

mylist = ["A","B","C"]

for blurb in mylist:
    blurb1.foo()

現在、そのような場合に if/elif-constructions を使用しています:

if blurb == "A":
    A1.foo()
elif blurb == "B":
    B1.foo()
elif blurb == "C":
    C1.foo()

それは機能しますが、確かにそれを行うよりエレガントな方法はありますか?

助けてくれてありがとう!ラスタルダ


Edit2:もう一度明確にしようとしています(以前はあまり一貫性がなかったことをお詫びします。これを理解するのは難しいです):

文字列からオブジェクトを作成してアクセスしたいと思います。

したがって、文字列を返す関数がある場合、たとえば、この文字列をリスト名として使用してリストを作成し、そのリストを処理します。

x = foo() # foo returns a string, e.g. "A"
# create list named whatever the value of x is
# in this case: 
A = []

x のすべての可能な結果のリストを準備し、長い elif 構造または辞書を使用するよりも洗練されたものはありませんか? その場合、eval() を使用する必要がありますか? (eval() は危険だと考えられているため、使用するのをためらっています。)

それが今ようやく明らかになることを願っています。どんな助けでも大歓迎です!

4

4 に答える 4

10

私はあなたがのようなものが欲しいと思います

lookup = {"A": A1, "B": B1, "C": C1}
obj = lookup.get(blurb,None)
if obj:
   obj.foo()

これは通常、誰かが(c / java / etcからの)switchステートメントで何かをしたいときに提案されます。lookup.get(lookup [blurb]だけでなく)がblurbが値の1つ以外のものである場合を処理することに注意してください。あなたはそれを定義しました...あなたはそれをtry/exceptブロックでラップすることもできます。


Joachim Pileborgが別の回答で言ったことに基づいて、改訂された質問に基づいて回答を更新しました。

これを行うにはおそらくより良い/よりクリーンな方法がありますが、文字列を介して設定/取得してグローバルオブジェクトを操作したい場合は、それを行うことができます。1つの方法は次のとおりです。「myvariable」という名前の新しいオブジェクトを作成する(または「myvariable」を新しい値に設定する)

joe = "myvariable"
globals().update([[joe,"myvalue"]])

オブジェクト「myvariable」を取得するには、次のものに割り当てられます。

globals().get(joe,None) 

(または別の回答で述べたように、getを使用する代わりに直接ハッシュでtry /exceptを使用できます)

したがって、後の例では、次のようなことを行うことができます。

for myobject in mylist:
    # add myobject to list called locus
    # e.g. if locus == "A", add to list "A", if locus == "B" add to list B etc.
    obj = globals().get(myobject.locus,None) # get this list object
    if not obj: # if it doesn't exist, create an empty list named myobject.locus
        obj = []
        globals().update([[myobject.locus,obj]]
    obj.append(myobject) #append my object to list called locus
于 2012-08-08T12:55:18.097 に答える
6

モジュールオブジェクトgetattrを取得し、文字列から変数/関数を取得するために使用できます。

import sys

A = {}
B = {}
C = {}

modname = globals()['__name__']
modobj  = sys.modules[modname]

mylist = ["A","B","C"]

for name in mylist:
    print '%s : %r' % (name, getattr(modobj, name))

上記のプログラムは次のように出力します。

A:{}
B:{}
C:{}

ただし、質問で参照する「ワイルドカード」とは関係ありませんが、「ワイルドカード」の検索は表示されません。

于 2012-08-08T13:07:58.580 に答える
3

を使用しますeval()

例:

A1 = []
B1 = []
C1 = []

mylist = ["A","B","C"]

for blurb in mylist:
    eval("%s1.append(blurb)" % blurb)

print A1,B1,C1
>>> 
['A'] ['B'] ['C']

そしてあなたのコードのためにそれはすることができます:

for blurb in mylist:
    eval("%s1.foo()" % blurb)
于 2012-08-08T13:07:20.210 に答える
1

一連のチェックを実行するのではなく、単に辞書が必要で、それを調べているようです。

dict_look_up = {'A' : A1, 'B' : B1, 'C' : C1}
try:
    dict_look_up[blurb].foo()
except KeyError:
    #whatever on item not found

try/exceptPython ではブロックは非常に重要です (許可よりも許しを求めるほうがよい)。

于 2012-08-08T14:33:19.110 に答える