【问题标题】:Function object is not iterable函数对象不可迭代
【发布时间】:2015-07-09 09:36:11
【问题描述】:

Generating an MD5 checksum of a file

我使用了上面链接中的一个示例,但通过删除对函数的调用(最初来自上面)对其进行了一些小改动:

import hashlib
hash = hashlib.md5()
with open('validFilePath/file.xxx', "r+b") as f:
    for block in iter(lambda: f.read(65536), ""):
        hash.update(block)
return hash.hexdigest()

这给了我以下错误。

File "<string>", line 4, in <module>
TypeError: 'function' object is not iterable

我错过了一些基本的 Python 前提吗?

【问题讨论】:

  • @jonrsharpe: 这是iter() 的有效用法,请参阅What's perfect counterpart in Python for "while not eof" 了解将可调用对象传递给iter() 的另一个示例。
  • 发布您的实际代码,特别是第 4 行。
  • 你能发布你的实际代码吗?
  • 确定你有iter()的第二个参数吗?例如,我可以使用iter(lambda: f.read(65536)) 重现您的错误消息。
  • @Padraic 我如何保留回报?这是我的实际代码: python -c "import hashlib hash = hashlib.md5() with open('/Volumes/Macintosh HD/AF 1/bbb.def', 'r+b') as f: for block in iter (lambda: f.read(65536), ""): hash.update(block) print hash.hexdigest()"

标签: python iterable hashlib


【解决方案1】:

几乎可以肯定缺少iter() function 的第二个参数。

如果没有第二个参数,第一个参数必须是可迭代的,但 lambda 会产生一个函数,而这不是可迭代的:

>>> iter(lambda: f.read(65536))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'function' object is not iterable

来自iter() 文档:

根据第二个参数的存在,第一个参数的解释非常不同。如果没有第二个参数,o 必须是支持迭代协议(__iter__() 方法)的集合对象,或者它必须支持序列协议(__getitem__() 方法,整数参数以 @ 开头987654328@)。如果它不支持这些协议中的任何一个,则会引发TypeError

使用第二个参数,您将获得一个适当的迭代器,供 for 循环进行迭代:

>>> iter(lambda: f.read(65536), '')
<callable-iterator object at 0x100563150>

每次迭代都会调用 lambda 函数,直到该函数返回空字符串 ''。换句话说,每次迭代读取 64Kb,直到到达文件末尾,此时 f.read() 操作返回一个空字符串,并且迭代器引发 StopIteration

【讨论】:

    【解决方案2】:

    谢谢...在 Martins 的帮助下解决了这个问题。感谢您指出错误的原因。由于某种原因,它不喜欢 iter 函数的第二个参数中提供的双引号。我将它们更改为单引号,该功能现在可以使用。

    -基思

    【讨论】:

    • 这应该没有什么区别,除非您实际上是在尝试按照您在评论中发布的那样运行它。在python中"'没有区别,你也不能在函数外返回
    • 是的......这就是我运行它的方式。我在 FileMaker Server SQA 中,我正在将一个小的动态 python 命令从控制箱发送到测试箱。大多数命令是 1 或 2 行 python。这些命令执行 getChecksum、copyFile、addRecord、deleteRecord、recordExists 等操作。这对我的测试非常有用。那么通过命令行运行时“和'之间有什么区别。我以为我通过转义引号正确保护了引号并在远程机器上看到了双引号。
    猜你喜欢
    • 2015-09-29
    • 2018-04-30
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多