代码中有一些不同的错误。导致异常的原因是函数data写入一个全局变量,并且不返回任何内容,但是后面的代码希望它返回可编辑的内容,例如序列或生成器。在
您可以通过让顶层代码直接在全局字典上迭代来解决这个问题,也可以去掉全局代码,在data中创建字典并在末尾返回它。我建议采用后者,因为随着代码变得越来越复杂,全局变量很难处理。在
下面是一个如何工作的粗略概述(我将对中间部分略作说明,因为我将在稍后讨论):def data(file):
objects = {}
# add stuff to objects dict
return objects
下一个错误是剥线。您的代码当前使用自己的strip方法测试每一行是否存在不等式。这是Python3中的一个错误,因为line和{}具有不可比较的类型。但即使成功了,也毫无意义。我怀疑你是在试图消除空行,先剥离空行,然后再拒绝空行。你可以这样做:
^{pr2}$
这是Python社区中一些人称之为“三思而后行”(LBYL)编程风格的一个例子,因为您正在检查可能是问题的东西,然后才变成问题。另一种方法是“请求原谅比请求许可更容易”(EAFP)样式,您只需将问题可能出现的区域包装在try块中并捕获生成的异常。EAFP样式有时被认为是更“python”的,所以稍后我将展示这种样式。在
下一个错误是逻辑错误,而不是导致错误的东西。您要拆分行,并希望将其两部分分成变量key和{}。但是,你对这些变量做了两个单独的赋值,事实上它们的结果都是相同的。在这里您可以使用Python语法的一个很酷的特性,即解压缩。您可以将一个两值序列(如列表或元组)一起分配给它们,而不是分别分配每个变量。Python将负责将第一个值赋给第一个变量,将第二个值赋给第二个变量。下面是它的样子:key, value = line.split(":")
当然,如果行中没有冒号,这将失败,因此如果我们使用EAFP样式的编码,那么它是放置try块的好地方。有一种方法可以做到:try:
key, value = line.split(":")
except ValueError:
continue
相反,可以将try块放在循环中剩余的所有内容的周围,然后让except块只包含pass(它什么也不做,但忽略了异常)。在
最后,最后一个逻辑错误与如何构建嵌套字典有关。你目前的方法是先用文件中的所有键和值构建一个字典,然后将它们分成单独的部分,每个天体一个。但是,如果每个对象的关键点相同,则此操作不起作用。举例来说,由于每个物体都有一个“轨道半径”键,所以它们都会相互重写,把这个键放到一个字典里。在
@sudo\u o的回答展示了如何构建内部字典并用值填充它(它几乎与我要写的内容相同)。我只想把剩下的解释贴出来!在