3

根据文档,六个支持将自定义重命名添加six.moves

six.add_move(item)

将项目添加到six.moves映射。item 应该是一个MovedAttributeMovedModule实例。

和:

class six.MovedModule(name, old_mod, new_mod)

six.moves为在 Python 2 和 3 中引用不同模块的被调用名称创建映射。old_mod是 Python 2 模块的名称。 new_mod是 Python 3 模块的名称。

但是,这段代码对我来说产生了一个ImportError

from six import add_move, MovedModule
add_move(MovedModule('mock', 'mock', 'unittest.mock'))
from six.moves.mock import MagicMock

当我使用六个 1.9.0 在 Python 3.4.2 上运行它时,我收到此错误:

Traceback (most recent call last):
  File "test_six_moves.py", line 2, in <module>
    from six.moves.mock import MagicMock
ImportError: No module named 'six.moves.mock'

内置动作工作得很好。我怎样才能让它工作?

4

1 回答 1

9

您无法从移动中导入名称。利用:

from __future__ import print_function

from six import add_move, MovedModule
add_move(MovedModule('mock', 'mock', 'unittest.mock'))

from six.moves import mock
print(mock.MagicMock)

这会给你:

# Python 2
<class 'mock.MagicMock'>

# Python 3
<class 'unittest.mock.MagicMock'>

请注意,从移动中导入适用于附带six. 例如:from six.moves.configparser import ConfigParser作品。

这段代码(来自six.py)是为什么:

for attr in _moved_attributes:
    setattr(_MovedItems, attr.name, attr)
    if isinstance(attr, MovedModule):
        _importer._add_module(attr, "moves." + attr.name)

事实上,如果您运行以下命令(当然不建议使用私有属性),您的导入将起作用:

import six
mod = six.MovedModule('mock', 'mock', 'unittest.mock')
six.add_move(mod)
six._importer._add_module(mod, "moves." + mod.name)
于 2015-01-29T12:58:15.183 回答