Самоанализ для пользовательских модулей Six.moves - PullRequest
1 голос
/ 27 февраля 2020

Чтобы помочь с переносом проекта 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')

...