Чтобы помочь с переносом проекта Django с Python 2 на Python 3, я добавил фрагмент кода, чтобы показать перемещение mock
на unittest.mock
.
Код, кажется, работает при запуске тестов. Он не полный, но он охватывает атрибуты, которые я использую.
Однако при просмотре импорта в PyCharm нет подсказок о типах, возможно, потому что встроенные подсказки с типами не знают о моих пользовательских перемещениях.
from six.moves import mock # for mock.ANY
from six.moves.mock import patch, PropertyMock, Mock
В приведенном выше примере PyCharm подчеркнет mock
(в обеих строках), patch
, PropertyMock
и Mock
, поскольку он не знает о них.
Поскольку я немного педанти c, я бы подумал о создании необходимых файлов .pyi для go с, но я не могу найти слишком много о них, где они должны находиться в базе кода и что они должен выглядеть следующим образом.
Мой вопрос: что я могу сделать, чтобы предоставить .pyi или аналогичный файл, чтобы PyCharm знал об этих определениях? модуль для моего six
использования для этих конкретных движений. т. е. from lib.six.moves.mock import Mock
, а my lib/six/__init__.py
содержит код и lib/six/moves/mock/__init__.pyi
с импортом для подсказки типа. Единственное, что я мог бы ограничить это Python 2 и иметь еще один .pyi для Python 3, в то время как проект должен работать в обеих версиях.
Ниже приведен пример кода, который живет в Django проекте __init__.py
, так что он включается везде. Это, вероятно, излишне, так как нужно только для юнит-тестов, но я не смог найти подходящее место.
import six
# https://stackoverflow.com/a/28215387/343614
# six.add_move only provides part of the solution
moved_module = six.MovedModule('mock', 'mock', 'unittest.mock')
six.add_move(moved_module)
six._importer._add_module(moved_module, "moves." + moved_module.name)
class Module_six_moves_mock(six._LazyModule):
"""Lazy loading of moved objects in six.moves.mock"""
_mock_moved_attributes = [
six.MovedAttribute('ANY', 'mock', 'unittest.mock'),
six.MovedAttribute('call', 'mock', 'unittest.mock'),
six.MovedAttribute('MagicMock', 'mock', 'unittest.mock'),
six.MovedAttribute('Mock', 'mock', 'unittest.mock'),
six.MovedAttribute('patch', 'mock', 'unittest.mock'),
six.MovedAttribute('PropertyMock', 'mock', 'unittest.mock'),
]
for attr in _mock_moved_attributes:
setattr(Module_six_moves_mock, attr.name, attr)
del attr
Module_six_moves_mock._moved_attributes = _mock_moved_attributes
six._importer._add_module(Module_six_moves_mock('six.moves.mock'), 'moves.mock', 'moves.unittest.mock')