【问题标题】:Updating existing dictionary key:tuple with new tuple (dict object not callable)使用新元组更新现有字典键:元组(字典对象不可调用)
【发布时间】:2021-03-10 22:05:26
【问题描述】:

我遇到了一个错误,告诉我我的字典对象不可调用,我想在联系 API 开发人员之前确保我正确引用了所有内容。目前正在为 Opentrons OT2 机器人编码。

我的项目是将管中的体积与告诉机器人设置高度的值相关联。字典 (dict_15ml_50ml) 以 API 开发人员推荐的格式编写。 代码遵循以下模式: 体积集> 增加或减少体积> 取整体积> 参考体积到 vol_15ml_starstedt> 创建具有调整体积和新高度的元组> 用新元组替换 dict_15ml_50ml 中的旧元组。

当我在 jupyter 中运行它时,我收到错误消息,指出 dict 对象不可调用。

import opentrons
from opentrons import protocol_api
from opentrons.simulate import get_protocol_api
import math
from datetime import datetime
from math import floor

protocol = get_protocol_api('2.8')
tuberack= protocol.load_labware('opentrons_15_tuberack_nest_15ml_conical','2','tuberack')
tiprack= protocol.load_labware('opentrons_96_tiprack_300ul','4')
instrument = protocol.load_instrument('p300_single', 'left')
instrument.home

vol_15ml_starstedt= {14000: 104, 13500: 101, 13000: 98, 12500: 94, 12000: 91, 11500: 88, 11000: 85, 10500: 81,
                    }
dict_15ml_50ml={
tuberack['A1']:(15000,95), tuberack['A2']:(15000,95),
                }

dict_tuberack= dict_15ml_50ml

def get_volume(dict_labware,well):
    tup = dict_labware.get(tuberack[well])
    return tup[0]

def get_height(dict_labware,well):
    tup = dict_labware.get(tuberack[well])
    return tup[1]

def volume_add(volume,dict_labware,well):
    tup = dict_labware.get(tuberack[well])
    volume1 = tup[0]
    volume2 = volume
    adj_volume = volume1+volume2
    adj_list=list(tup)
    adj_list[0]=(adj_volume)
    tup=tuple(adj_list)
    return tup[0]

def volume_sub(volume,dict_labware,well):
    tup = dict_labware.get(tuberack[well])
    volume1 = tup[0]
    volume2 = volume
    adj_volume = volume1-volume2
    adj_list=list(tup)
    adj_list[0]=(adj_volume)
    tup=tuple(adj_list)
    return tup[0]

def tup_update(volume,dict_vol,dict_labware,well):
    
    tup = dict_labware.get(tuberack[well])
    adj_list=list(tup)
    adj_list[0]=volume
    divisor=1
    if volume >=1000:
        divisor=1000
    elif volume <1000 >= 100:
        divisor=100
    else:
        divisor = 10
    
    def round_down(volume,divisor):
        vol_even=floor(volume/divisor)*divisor
        return vol_even
    
    vol_even=round_down(volume,divisor)
    new_height=dict_vol.get(vol_even)
    adj_list[1]=new_height
    
    new_tup=tuple(adj_list)
    target=dict_labware(tuberack[well])
    target.update(new_tup)




x=volume_sub(2000,dict_tuberack,'A1')
tup_update(x,vol_15ml_starstedt,dict_tuberack,'A1')
print(dict_tuberack(tuberack['A1'])) 

【问题讨论】:

  • dict_labware(tuberack[well]) 和其他类似的实例将字典视为一个函数。你是说dict_labware[tuberack[well]],还是dict_labware.get(tuberack[well])
  • @Carcigenicate 密钥必须被引用为 tuberack['A1'] 因为 tuberack 是一个与机器人对话的函数。
  • 您正确引用了tuberack 的密钥。问题在于您如何引用dict_labware 的密钥。应该是[],而不是()
  • @Carcigenicate 好的,所以我在 def tup_update 下修复了该引用。现在它告诉我元组对象没有属性更新
  • @Barmar 你是对的,它修复了当前的错误。现在它告诉我元组对象没有属性更新

标签: python python-3.x dictionary tuples


【解决方案1】:
    target=dict_labware(tuberack[well])
    target.update(new_tup)

应该是

    dict_labware[tuberack[well]] = new_tup

您使用[] 来引用字典的元素。 () 用于调用函数。 update() 用于合并字典,但 targetnew_tup 是元组,而不是字典。元组是不可变的,所以你不能像那样合并它们。

【讨论】:

    【解决方案2】:

    @barmar 和 @carcigenicate 得到了答案。

    def tup update 改为

    def tup_update(volume,dict_vol,dict_labware,well):
    
    tup = dict_labware.get(tuberack[well])
    adj_list=list(tup)
    adj_list[0]=volume
    divisor=1
    if volume >=1000:
        divisor=1000
    elif volume <1000 >= 100:
        divisor=100
    else:
        divisor = 10
    
    def round_down(volume,divisor):
        vol_even=floor(volume/divisor)*divisor
        return vol_even
    
    vol_even=round_down(volume,divisor)
    new_height=dict_vol.get(vol_even)
    adj_list[1]=new_height
    
    *new_tup=tuple(adj_list)
    dict_labware[tuberack[well]]=new_tup*
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-28
      • 2020-09-25
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 2010-11-28
      • 2017-10-06
      • 1970-01-01
      相关资源
      最近更新 更多