TypeError:“ NoneType”对象不可迭代....... Python错误

时间:2019-10-06 14:05:48

标签: python python-3.x python-2.7

我正在尝试执行此代码。它是用2.x编写的,而我正在python 3.7中进行更改。我能够更改它并执行其中的90%。但是我收到类型错误。

我有一个文件train.py

  import SceneDesc
  import sys

  def train(epoch):
      sd = SceneDesc.scenedesc()
      model = sd.create_model()
      batch_size = 512
      model.fit_generator(sd.data_process(batch_size=batch_size), 
      steps_per_epoch=sd.no_samples/batch_size, epochs=epoch, verbose=2, 
      callbacks=None)
      model.save('Output/Model.h5', overwrite=True)
      model.save_weights('Output/Weights.h5',overwrite=True)

  if __name__=="__main__":
      train(int(sys.argv[1]))

另一个文件是SceneDesc.py。在train.py中,我正在调用我在SceneDesc.py文件中创建的class scenedesc。

  class scenedesc():
      def __init__(self):
          self.vocab_size = None
          self.no_samples = None
          self.max_length = None
          self.index_word = None
          self.word_index = None    
          file = open("image_encodings.p", "rb")
          self.image_encodings = pickle.load(file, encoding='bytes')
          self.captions = None
          self.img_id = None
          list(self.values())

在执行train.py文件时。我收到以下错误:

   File "D:\Image-caption\Image-Captioning-master\SceneDesc.py", line 24, 
   in __init__
      list(self.values())
   TypeError: 'NoneType' object is not iterable

哪个位于第list(self.values())行的SceneDesc.py文件中。我试图解决它,但是无法解决。请帮助我解决此错误。

2 个答案:

答案 0 :(得分:0)

在类values()中检出函数scenedesc(),并确保它返回可迭代的内容,很可能是您在return的末尾忘记了values()关键字

一个好消息是没有关键字return的函数,这意味着您没有显式地对函数进行编码以返回一些值,无论如何它将返回值None

答案 1 :(得分:0)

正如@zvone在评论中所暗示的那样,问题似乎集中在此行以及该行未产生您期望的值的事实:

list(self.values())

self.values()希望接受某种形式的可迭代值序列以使其产生None时,对list()的调用将返回一个list值。 / p>

虽然这与您的问题没有特别关系,但我也想知道为什么您将self.values转换为列表,却没有在任何地方保存该新值。

如前所述,该行将尝试在内存中创建一个列表,但不会将其保存在任何地方以备将来使用或处理。我期望像这样:

    mylist = list(self.values())

没有看到与self.values()生成的代码有关的实际代码,我很难进一步诊断。如@isaac Newton所提到的,如果您的self.values()代码恰好缺少一个return语句,Python将默认使该函数返回一个None值。