2017-02-14 8 views
0

文字列から変数名を割り当てたいという問題があります。私はこれが動的に変数名を割り当てると考えていますが、私はこの状況には当てはまらないと思っている他のページのソリューション、あるいは私は単に理解していません。Pythonでの文字列の反復によるクラス変数の割り当て

私は文字列をチェスボードに変換しようとしています。ボードはリストのリストです。各列には行があり、各項目にはそれぞれの列があります。

def splitString(string, length): 
    """Split string into lengths on n.""" 
    return [string[i:i + length] for i in range(0, len(string), length)] 


def colourFromCase(letter): 
    """Work out if a letter is uppercase, therefore white.""" 
    if letter.isupper(): 
     return 'white' 
    else: 
     return 'black' 


def buildBoard(height, width): 
    """Build a board.""" 
    global rows 
    rows = [] 
    board = 'CNBHKDRNCPPPPPPPPPpppppppppcnrdkhbnc' 
    split = splitString(board, width) 
    for n in split[0]: 
     className = eval(str(ABBRIVIATIONS[(n.upper())]) + 
         '(' + colourFromCase(n) + ') 

最後のforループは、ビルドボード機能に重点を置いています。私はクラス変数であるnの名前で変数を作る必要があります。

私の最初の推測では、次のようになります。

eval(n) = eval(str(ABBRIVIATIONS[(n.upper())]) + 
       '(' + colourFromCase(n) + ') 

私はこの信じられないほど明らかにされていませんでした理解しています。私はevalやexecを使ってはいけないと思っていますが、board.appendを使ってボードに変数を追加しようとしてから辞書やgetattr()を使う方法がわかりませんあなたはFIGURES辞書で参照可能なすべての数字を持っていることを確認し、もちろん

FIGURES = {"B": BType, "C": CType, "D": DType, "H": HType, "K": KType, "N": NType, "R": RType} 

def buildBoard(height, width): 
    """Build a board.""" 
    global rows 
    rows = [] 
    board = 'CNBHKDRNCPPPPPPPPPpppppppppcnrdkhbnc' 
    split = splitString(board, width) 
    for n in split[0]: 
     figure = FIGURES[n.upper()](colourFromCase(n)) 
     # etc. 

と彼らはを指しているします)

+1

これを行わないでください。ほとんど必要ではありません。代わりに辞書を使用して文字列と値のペアを格納します。 'eval'の使用は赤旗を発生させるはずです。 – Carcigenicate

+0

私はこれを例にして私をいくつかの場所にリンクすることができますが、私は何をgoogleにするのかわかりません... – Skidushe

+0

Pythonの辞書( '{}')は何ですか? – Carcigenicate

答えて

0

あなたはいつも例えば、あなたのクラス型への参照を保持するディクショナリマップを使用することができますABBRIVIATIONSに今保存しているものまた、のクラスで、init引数として白黒の文字列を受け入れるようにしてください。

関連する問題