Неиссякаемые типы и замена входов

Цель проста: показать диалоговое окно с параметрами, затем, когда параметр будет выбран, он автоматически заменит некоторые значения (чтобы уменьшить вероятность ошибки при вводе значений вручную). Следующий код является частью большего кода, но это самая важная часть. Большой кусок кода был написан кем-то другим. Я написал следующий блок:

if expInfo2['quadrant'] == 'UL':
        expInfo['refOrientation':'45','x':'-4.24','y':'4.24']
    elif expInfo2['quadrant'] == 'LL':
        expInfo['refOrientation':'-45','x':'-4.24','y':'-4.24']
    elif expInfo2['quadrant'] == 'UR':
        expInfo['refOrientation':'-45','x':'4.24','y':'4.24']
    elif expInfo2['quadrant'] == 'LR':
        expInfo['refOrientation':'45','x':'4.24','y':'-4.24']

Код работает нормально, пока не прочитает вторую строку, и выдает следующую ошибку:

Traceback (most recent call last): File "D:\User\File\Experiment.py", line 48, in <module> expInfo['refOrientation':'45','x':'-4.24','y':'4.24'] TypeError: unhashable type ()

Мой опыт программирования ограничен, но я понимаю, что вещи, которые я положил во второй строке, не подходят друг другу. Тем не менее, я думал о разделении их по частям, но я не думаю, что это сработает, как в следующем:

if expInfo2['quadrant'] == 'UL':
    expInfo['refOrientation':'45']
    expInfo['x':'-4.24']
    expInfo['y':'4.24']
et cetera...

Полный код:

#present a dialogue to chose lab room and whether eyetracker is on or not
expInfo2 = {'lab':'2','eyetracker': '0','quadrant':''}
dlg = gui.Dlg(title="Info", pos=(200, 400))
dlg.addField('Which lab are you in? 2 for lab-2, 3 for lab-3',expInfo2['eyelab'])
dlg.addField('Do you want the eyetracker on? 0 for yes, 1 for no',expInfo2['eyetracker'])
dlg.addField('What quadrant is used? UL=Upper Left, LL=Lower Left, UR=Upper Right, LR=Lower Right',expInfo2['quadrant'])
inf = dlg.show()

expInfo2['lab']=inf[0]
expInfo2['eyetracker'] = inf[1]
expInfo2['quadrant'] = inf[2]

############################## THIS IS THE CODE FOR LAB 2 ###########################################
if expInfo2['lab'] == '2':


    expInfo = {'observer':'insert','typeofstaircase':'insert','refOrientation':'','startorient':'insert','x':'','y':'','numstair':4,}
    dateStr = time.strftime("%b_%d_%H%M", time.localtime())#add the current time

    if expInfo2['quadrant'] == 'UL':
        expInfo['refOrientation':'45','x':'-4.24','y':'4.24']
    elif expInfo2['quadrant'] == 'LL':
        expInfo['refOrientation':'-45','x':'-4.24','y':'-4.24']
    elif expInfo2['quadrant'] == 'UR':
        expInfo['refOrientation':'-45','x':'4.24','y':'4.24']
    elif expInfo2['quadrant'] == 'LR':
        expInfo['refOrientation':'45','x':'4.24','y':'-4.24']

    #present a dialogue to change params
    dlg = gui.Dlg(title="Info", pos=(200, 400))
    dlg.addField('Observer:',expInfo['observer'])
    dlg.addField('Type of staircase?', expInfo['typeofstaircase'])
    dlg.addField('Start Orientation Increment:',expInfo['startorient'])
    dlg.addField('X:',expInfo['x'])
    dlg.addField('Y:',expInfo['y'])
    dlg.addField('Ref. Orienation:',expInfo['refOrientation'])
    #dlg.addField('Number of Staircases',expInfo['numstair'])
    inf = dlg.show()

    expInfo['observer']=inf[0]
    expInfo['typeofstaircase'] = inf[1]
    expInfo['startorient']=inf[2]
    expInfo['x']=inf[3]
    expInfo['y']=inf[4]
    expInfo['refOrientation']=inf[5]
    #expInfo['numstair'] = inf[6]
    #dlg = gui.DlgFromDict(expInfo, title='info', fixed=['date'])
    #if dlg.OK:
    #    print(expInfo)
    #else:
    #    core.quit()#the user hit cancel so exit

Какие-либо предложения?

1 ответ

Решение
expInfo['refOrientation':'-45','x':'-4.24','y':'-4.24']

Так что это интерпретируется как

expInfo.__getitem__((
   slice('refOrientation', '-45', None),
   slice('x', '-4.24', None),
   slice('y', '-4.24', None)
))

, 3 кортежа объектов среза. expInfo это словарь, и принимает только

hash((
   slice('refOrientation', '-45', None),
   slice('x', '-4.24', None),
   slice('y', '-4.24', None)
))

поднимает ошибку

 TypeError: unhashable type: 'slice'

потому что, ну, они не хасить Очень и очень странно использовать строки в таких срезах, поэтому я не думаю, что вы вводите ключ правильно.


Я думаю, что вы пытаетесь обновить словарь. Для этого вы хотите:

if expInfo2['quadrant'] == 'UL':
    expInfo.update({'refOrientation': '45', 'x': '-4.24', 'y': '4.24'})
elif expInfo2['quadrant'] == 'LL':
    ...

(обратите внимание на пробел, который я вставил, чтобы сделать его более читабельным. Я бы посоветовал прочитать PEP8, прежде чем идти дальше с python, так как вы выбросили руководство по стилю в окно).

Другие вопросы по тегам