Создание фиктивной библиотеки, если дополнительная библиотека не может быть загружена - приемлемая практика? - PullRequest
1 голос
/ 19 мая 2019

Я хочу напечатать в Python 3.6, используя цветной , если этот пакет доступен, например:

print('{}Hello, world!{}'.format(colored.fg(1), colored.attr(0)))

Однако я хочу сделать colored необязательным, если это возможно, в то время какпо-прежнему печатать любой текст, который может быть стилизован.Простое создание функции-обертки для печати кажется неадекватным из-за множества способов, которыми вы можете использовать colored, таких как colored.stylize() и добавление цветов вместе:

cheerful = colored.fg('cyan') + colored.attr('bold')
print(colored.stylize("Hello, world!", cheerful, colored.attr("underlined"))

Хотя для тестирования обычно используется насмешка, Является ли приемлемой практика создания фиктивной библиотеки для использования, если дополнительная библиотека недоступна ?Примерно так, в модуле под названием colored_mock (насмешка, как описано в этом вопросе ):

from unittest.mock import Mock
import sys
import types

module_name = 'mock_colored'
mock_colored = types.ModuleType(module_name)
sys.modules[module_name] = mock_colored

# following the original definition
def stylize(string, styles, reset=True):
    # return the original string so it can be used
    return string

mock_colored.stylize = Mock(name=module_name+'.stylize', side_effect=stylize)

# and so on until most of the module attributes and functions are covered

Таким образом, я могу сделать:

try:
   import colored
except ImportError:
    from .mock_colored import mock_colored as colored

1 Ответ

0 голосов
/ 01 июня 2019

Использование Mock предполагает, что вы тестируете.Если это ваш собственный код, может быть лучше иметь оболочку для stylized плюс любые другие colored импортируемые вами методы:

colored_imported = False
try:
    import colored
    colored_imported = True
except ImportError: 
    pass

def stylized(string, styles, reset=True):
    if colored_imported:
        return colored.stylized(string, styles, reset=reset)
    else:
        return string

Это поможет выявить проблемы, вызванные методами с ошибками (например,, stylised) или слишком мало параметров.Этот подход также должен облегчить понимание и отладку вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...