2017-02-14 7 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) + ') 

Основное внимание уделяется функции buildBoard - последней для цикла. Мне нужно создать переменную с именем n, которое является переменной класса.

Моя первая догадка будет:

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

Я понимаю, что я не сделал это невероятно ясно. Я не думаю, что eval или exec - путь, но я не понимаю, как использовать словари или getattr() для этого, так как после того, как я собираюсь добавить переменную на доску с board.append ()

+1

Не делайте этого. Это почти никогда не нужно. Вместо этого используйте словарь для хранения пар строк/значений. Использование 'eval' должно было поднять красные флаги. – Carcigenicate

+0

Не могли бы вы связать меня с каким-нибудь местом с примерами этого, я не знаю, что делать с Google ... – Skidushe

+0

Знаете ли вы, что такое словарь ('{}') в Python? – Carcigenicate

ответ

0

вы всегда можете использовать словарь карты держит ссылки на ваши типы класса, например:

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. 

конечно, убедитесь, что у вас есть все возможные цифры, на которые ссылается FIGURES словарь и убедитесь, что они указывают на что вы сейчас храняете в ABBRIVIATIONS. Кроме того, убедитесь, что ваши классы принимают в качестве аргумента init строку white/black.