2015-01-29 2 views
3

Согласно документации, шесть опор adding custom renames к six.moves:Как добавить пользовательские переименования в шесть?

six.add_move(item)

Add item to the six.moves mapping. item should be a MovedAttribute or MovedModule instance.

И:

class six.MovedModule(name, old_mod, new_mod)

Create a mapping for six.moves called name that references different modules in Python 2 and 3. old_mod is the name of the Python 2 module. new_mod is the name of the Python 3 module.

Однако этот код дает ImportError для меня:

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

Когда я запускаю его на Python 3.4.2 с использованием шести 1.9.0 Я получаю эту ошибку:

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' 

Встроенные ходы работают нормально. Как мне заставить это работать?

ответ

8

Вы не можете импортировать имя из перемещения. Использование:

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) 
+1

Ах спасибо, тот факт, что импорт изнутри ходов работает для встроенных, меня смутил. –

+1

@ BjörnPollex Это действительно немного запутанно, что 'add_move' не делает этого для вас. Я уверен, что есть причина, хотя я точно не знаю, что это такое. –

+1

Не могу использовать 'from six.moves.mock import Mock' действительно беспокоить меня. До сегодняшнего дня я использовал структуру пакетов, такую ​​как 'portability.mock', и в' mock' копировал весь макет модуля 'from six.moves.mock import *'. Сделайте копию даже хуже, и я действительно испытываю соблазн использовать личный доступ '_importer' ... просто примечание: на ubuntu 14,04 python 3 поставляется с' six' 1.5.2, и этот трюк не работает –

 Смежные вопросы

  • Нет связанных вопросов^_^