2017-02-14 4 views
0

Ich habe das Problem, Variablennamen aus Strings zuweisen zu wollen. Ich verstehe, dass dies dynamische Variablennamen zuweist, aber Lösungen auf anderen Seiten, die ich nicht für diese Situation anwende, oder ich verstehe es einfach nicht.Zuweisen von Klassenvariablen durch Iteration eines Strings in Python

Ich versuche, eine Zeichenfolge in ein Schachbrett zu verwandeln, wobei die Tafel eine Liste von Listen ist. Jede listet eine Zeile auf, jeder Eintrag seine jeweilige Spalte.

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) + ') 

Der Schwerpunkt liegt auf der buildBoard-Funktion - der letzten for-Schleife. Ich muss eine Variable mit dem Namen von n machen, die eine Klassenvariable ist.

Meine erste Vermutung wäre:

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

Ich verstehe, ich habe nicht unglaublich klar gemacht dies. Ich denke nicht, eval oder exec ist der Weg zu gehen, aber ich sehe nicht, wie ich Wörterbücher oder getattr() dies tun könnte, seit ich die Variable zu einem Board mit board.append ()

+1

Tun Sie das nicht. Es ist fast nie notwendig. Verwenden Sie stattdessen ein Wörterbuch, um String/Wert-Paare zu speichern. Die Verwendung von "eval" sollte rote Flaggen haben. – Carcigenicate

+0

Durch einen Zufall könnten Sie mich mit einem Ort mit Beispielen verbinden, ich habe keine Ahnung, was ich googlen soll ... – Skidushe

+0

Wissen Sie, was ein Wörterbuch ('{}') in Python ist? – Carcigenicate

Antwort

0

Sie können immer ein Wörterbuch Karte hält Verweise auf Ihre Klassentypen verwenden, zB:

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. 

natürlich, stellen Sie sicher, dass alle möglichen Zahlen im FIGURES Wörterbuch verwiesen haben und stellen Sie sicher, sie zeigen auf was Sie jetzt in ABBRIVIATIONS speichern. Stellen Sie außerdem sicher, dass die Klassen figure weiß/schwarze Zeichenfolge als Init-Argument akzeptieren.

Verwandte Themen