【问题标题】:Matching Binary operators in Tuples to Dictionary Items将元组中的二元运算符与字典项匹配
【发布时间】:2012-07-21 06:57:20
【问题描述】:

所以,我正在做一个 Pybrain 类型的项目,但我被困在其中的一部分上。 到目前为止,该程序接收一个元组并使用“其中一个花哨的vars()['string'] 语句”为其分配一个变量。具体来说,它接收一个数字元组并将其分配给一个 'layerx' 值,其中x 是层的编号(按顺序,第 1、2、3 层等),因此这些数字是该层的尺寸。

我绝望而谦卑地向您寻求帮助的程序部分是该程序的下一步应该是什么;它接受一个元组的元组(元组的数量必须=层的数量),并且元组包含1/0。

它应该确定在哪个层中使用哪种类型的 Pybrain 层,然后插入该层的维度值,并从本质上创建该层变量。我已经......玩了一段时间,我得到了一个非常......扭曲......令人困惑的代码块。

请原谅那些令人费解的变量名,我认为我将它们具体化是很聪明的:

    moduleconbuff = 0
    modulebuffer = 'module'
    correspondinglayerbuff = 0
    moduleconfigcopy = tuple(moduleconfig)

    try:  #Always triggers except, but it's pretty screwed up
                while correspondinglayerbuff <= len(self.layers):     #keeps track of how many layer/module pairs have been assigned
                    for elm in moduleconfigcopy:
                        for x in elm:
                            if x == 1:
                                moduledimmension = [layerbuff+'%s'%(correspondinglayerbuff)]
                                modulesdict = {1: pybrain.GaussianLayer(moduledimmension), 2: pybrain.LinearLayer(moduledimmension),\
                                3: pybrain.LSTMLayer(moduledimmension),4: pybrain.SigmoidLayer(moduledimmension),5: pybrain.TanhLayer(moduledimmension)}   #this dict pairs integers with pybrain modules
                                vars()[modulebuffer +'%s'%(correspondinglayerbuff)]=modulesdict(moduleconbuff)  #should return something like 'Module1 = pybrain.GaussianLayer(5) when complete
                                print vars()[modulebuffer+'%s'%(correspondinglayerbuff)]
                                moduleconbuff=0
                                correspondinglayerbuff+=1
                                print 'Valid: ', moduleconfigcopy, elm
                                continue
                            else:
                                elm = elm[1:]
                                print 'Invalid: ', moduleconfigcopy, elm
                                moduleconbuff+=1
    except:  
        print 'Invalid!!!'

老实说,我完全不知道里面发生了什么。开头的元组“moduleconfig” 应该是带有二元运算符的元组(嵌套元组)的元组,它应该在其中一个元组有 1 时停止,将该运算符与 Pybrain 中的正确模块匹配,然后将其插入相应层 =该模块的尺寸已列出。

很明显,出了什么大问题,而且已经太远了,以至于我的大脑无法理解它……它失去了所有的理由,每次我看到它我都会害怕……请帮助我或告诉我我想我创造了一个可憎之类的东西......

【问题讨论】:

  • 快速提示:使用except 捕获特定异常(例如NameError 或TypeError。尽量减少try 块中的代码量,使其仅位于您期望的代码处)错误。并且只捕获您可以处理的错误。似乎您的 try..except 块没有做这些事情。做这样的事情将有助于您的代码中“我忘记了正在发生的事情”部分。跨度>
  • 我只是使用 try...except 块作为临时调试点,直到我可以弄清楚代码并继续具体细节....注意点,虽然
  • 赤裸裸的 except 不会帮助你调试,因为它给你的信息更少,而不是更多。例如,而不是IndexError(以及错误的特定行),现在您只会得到一个模棱两可的“无效!!”打印到标准输出。
  • 那moduleconfigcopy的内容是什么?
  • 它 (moduleconfigcopy) 将接受提供给类的参数,它是元组元组的副本: ((0, 1), (0, 0, 1), (0, 1)),本质上。我只是复制了这个论点,所以我可以操纵它..

标签: python tuples pybrain


【解决方案1】:

影响代码可读性的一个巨大障碍是变量命名和样式。我试着为你清理一下。它仍然可能无法正常工作,但现在更容易看到发生了什么。请参考 PEP 8,Python style guide

首先,我在下面重命名了一些变量。请注意,在 python 中,变量应该全部小写,单独的单词用下划线连接。常量应该是 ALL_UPPERCASE:

assigned_layers = correspondinglayerbuff = 0
tuple_of_tuples = moduleconfigcopy = ((0, 1), (0, 0, 1), (0, 1))
dimension = moduledimension
MOD_BUFFER = modulebuffer = 'buffer'
c_buff = moduleconbuff = 0

这是 while 循环(替换了变量名,并适当缩进,删除了 try... except 块:

while assigned_layers <= len(self.layers):
    for element_tuple in tuple_of_tuples:
        for item in element_tuple:
            if item: # in python, 0 is treated as boolean False, 1 or any other value is treated as boolean True.
                dimension = [layerbuff + str(assigned_layers)] #what is layerbuff?
                modules_dict = {
                    1: pybrain.GaussianLayer(dimension),
                    2: pybrain.LinearLayer(dimension),
                    3: pybrain.LSTMLayer(dimension),
                    4: pybrain.SigmoidLayer(dimension),
                    5: pybrain.TanhLayer(dimension)
                    } # Notice how this dict is much easier to read.

                vars()[MOD_BUFFER + str(assigned_layers)] = modules_dict[c_buff]  #modules_dict is a dict and not a callable object
                c_buff = 0
                assigned_layers +=1
                #No need for continue here, since that's what the if...else does here.
            else:
                element_tuple = element_tuple[1:] #what is this for?
                print 'Invalid: ', tuple_of_tuples, element_tuple

我不确定您在这一行中到底要做什么:

vars()[MOD_BUFFER + str(assigned_layers)] = modules_dict[c_buff]  #modules_dict is a dict and not a callable object

此外,您最初拥有 modules_dict(moduleconbuff),它将引发 TypeError,因为 dict 不是可调用对象。我假设您打算按键检索一个值。

正如我所说,我不太确定您在这里尝试做什么(可能是因为我还没有看到您的其余代码),但是重命名您的变量和使用良好的风格应该对您有很大帮助能够调试您的代码。如果您回答我的问题/评论,我将继续编辑。

【讨论】:

  • 谢谢,我会插上电源看看它是否有效,我猜?至于字典的奇怪设置,我使用的编辑器(Pydev for Eclipse)认为该特定设置会因任何原因引发各种错误,尽管我使用了完全相同的设置....
  • @AaronSnipsTp:我只是说这是一个起点。我怀疑上面的代码会按原样“工作”。它意味着比您发布的代码更容易调试。我必须知道这段代码是如何与你班级的其他人交互的,才能写出“有效”的东西。
  • 注意到了,但它看起来确实......现在更干净了,所以可以使用它,谢谢!
  • 其实现在看起来像逻辑代码,但是由于for...循环中被迭代的“item”是一个整数,所以它似乎不起作用,我真的想不出来有什么方法可以调用元组中的单个项目来完成这段代码......我怎样才能绕过“TypeError:'int' object is not iterable”?
  • int、element_tuple 或 item 是哪一个? item 没有在代码中被迭代,所以它必须是element_tuple。这意味着tuple_of_tuples 中至少有一个元素不是元组。
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2019-02-24
  • 2014-06-12
  • 1970-01-01
  • 2013-01-01
  • 2011-07-09
  • 2014-04-20
相关资源
最近更新 更多