【问题标题】:None type object is not iterable无类型对象不可迭代
【发布时间】:2012-04-15 21:08:57
【问题描述】:

在有人告诉我再搜索网络之前,我已经搜索了一个多小时。

所以我的任务要求我使用一个导入的模块,该模块包含一个 safeOpen 函数,该函数为主模块selectiveFileCopy 打开一个文件。但是当我调用 safeOpen 函数时,它说我要打开的文件是 None 类型,因此不可迭代。我不知道为什么会这样。

这里有一些代码:

def safeOpen(prompt, openMode, errorMessage ):
   while True:
      try:
         open(input(prompt),openMode)
         return 
      except IOError:
         return(errorMessage)

def selectivelyCopy(inputFile,outputFile,predicate):
   linesCopied = 0
   for line in inputFile:
      outputFile.write(inputFile.predicate)
      if predicate == True:
         linesCopied+=1
   return linesCopied


inputFile = fileutility.safeOpen("Input file name: ",  "r", "  Can't find that file")
outputFile = fileutility.safeOpen("Output file name: ", "w", "  Can't create that file")
predicate = eval(input("Function to use as a predicate: "))   
print(type(inputFile)) 
print("Lines copied =",selectivelyCopy(inputFile,outputFile,predicate))

【问题讨论】:

  • 错误出现在哪一行?

标签: python python-3.x


【解决方案1】:

你必须返回文件对象本身:

return open(input(prompt),openMode)

还有一些 cmets。您的大部分代码都没有什么意义。

  1. safeOpen 中,您有一个无限循环,但在第一次迭代后无条件地离开它。你根本不需要这个循环。
  2. safeOpen 返回文件对象或错误消息。一般来说,函数应该总是返回相似类型的对象,并使用异常来表示错误。
  3. safeOpen 吞下异常,因此不如内置的 open 安全。
  4. inputFile.predicate 尝试从文件对象inputFile 中读取一个名为predicate 的属性。这将产生一个AttributeError,因为不存在这样的谓词。如果要将谓词函数传递给函数,请将其称为predicate(object)
  5. predicate == True 仅在 predicate 是布尔值时才有效,这不是您想要的。
  6. 行计数实际上并不计算复制的行数。

【讨论】:

  • 1-3) 老实说,我只是按照我的教授在他的作业中指定的内容去做。他要求循环、尝试和返回语句,并且基本上从课堂上查看他的代码并尝试模仿它。 4) 修复了..那种 5) 我想要什么? 6) 修复了
  • 我想我忘了提到还有另一个被导入的模块,称为选择,具有返回布尔值的函数。这些是我的教授的“谓词”。指定。
猜你喜欢
  • 2015-11-28
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 2012-10-30
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多