3

我试图通过numpy.fromfile一个 mocked file,我不断收到以下错误:

IOError: !first 参数必须是打开的文件

这是一个基本示例,使用mock_open取自模拟包的更多示例部分:

import numpy as np
from mock import MagicMock, patch

file_spec = file

def mock_open(mock=None, data=None):
    if mock is None:
        mock = MagicMock(spec=file_spec)

    handle = MagicMock(spec=file_spec)
    handle.write.return_value = None
    if data is None:
        handle.__enter__.return_value = handle
    else:
        handle.__enter__.return_value = data
    mock.return_value = handle
    return mock


if __name__ == "__main__":
    m = mock_open()
    with patch('__main__.open', m, create=True):
        with open('foo', 'rb') as h:
            print h.mock_calls
            try:
                result = np.fromfile(h)
            except IOError:
                print "io error!"
                print h.mock_calls

导致:

% [call.__enter__()] 
% io error!
% [call.__enter__()]

我可以嘲笑numpy.fromfile,这可能就是我最终会做的事情。我无法理解以下内容

  1. 为什么上面的例子不起作用
  2. 为什么我在调试时遇到麻烦fromfile(通过pdb.set_trace()在之前调用fromfile并进入fromfile. 调试器似乎无论如何都会跳过调用。
  3. fromfile为什么我在numpy源代码中找不到。这样的函数存在于numpy/numarray/functions.py,numpy/core/records.py和中numpy/ma/core.py,但这些函数都不会像上面列出的那样引发错误。

非常感谢澄清上述问题的任何帮助。顺便说一句,我使用numpy的是 1.6.1 版本。

4

1 回答 1

1

我不确定为什么您的模拟 open() 不起作用,但是由于您立即调用自己的模拟,因此您有一个更简单的选择:使用 . 创建一个文件StringIO,并将其交给 numpy.fromfile。

问题 2 和 3 可能是由于 numpy.fromfile 是用 C 编写的。

于 2012-06-18T19:01:01.797 回答