Как импорт модуля внутри функции делает код более модульным?

Из погружения в Python:

Вы привыкли видеть операторы импорта в верхней части программы, что означает, что импортированный модуль доступен в любом месте программы. Но вы также можете импортировать модули внутри функции, что означает, что импортированный модуль доступен только внутри функции. Если у вас есть модуль, который когда-либо используется только в одной функции, это простой способ сделать ваш код более модульным.

Другой альтернативой импортированию модуля на уровне функций является его импорт на уровне модулей (частью которых является функция).

Поскольку модуль является модулем многократного использования, как первый вариант увеличивает модульность?

1 ответ

Я не уверен, что импорт на уровне функций является более модульным. Импорт функции (или класса) из модуля в Python разрешит зависимости библиотек, и эти импортированные функции будут работать без импорта тех же библиотек.

(Примечание: я использую библиотеку, чтобы не произносить модуль через любое другое слово)

Пример:

my_module.py

import sys

def printerr(message):
    """Use stderr for error messages"""
    sys.stderr.write('{0}\n'.format(message))
    sys.stderr.flush()

my_script.py

import os

from my_module import printerr


def main():
    """Derpy script"""
    if 'my_important_file.txt' in os.listdir():
        print("it's there")
    else:
        printerr("ERROR: Unable to find important file")

Учитывая это, это чрезвычайно упрощенный пример, но импорт sys в printerr не сделает его более модульным. Это одинаково модульно в любом случае.

По моему опыту, проблемы, которые могут возникать и возникают, связаны с накоплением технического долга, когда речь идет о модульности.

Во-первых, у вас есть простой модуль с четко определенным представлением о том, что он делает. Библиотеки, импортированные в этот модуль, имеют смысл и широко используются в функциях / классах внутри него.

С течением времени и добавлением функций мы часто просто добавляем новые функции / классы в модуль "наилучшего соответствия" (т. Е. "Я думаю, что имеет смысл поместить это здесь?").

Проходит больше времени, и популярность библиотеки становится все более популярной, поэтому я буду ее использовать, но я действительно не хочу тратить несколько недель на замену всего этого старого кода (как будто у меня есть такое время, у меня есть вещи для делать!).

Вскоре у вас есть немного кода, который импортирует около 20 вещей и делает многое. И, конечно же, нет никаких юнит-тестов, поэтому каждый раз, когда вы к ним прикасаетесь, вы что-то ломаете, но чтобы выяснить...

Теперь вам надоело иметь дело с этим, так что винт, я просто импортирую то, что я хочу, в мои функции, которые его используют; это проще, чем иметь дело с 20 импортными товарами.

Очень убедительная причина не импортировать в функции хорошо продемонстрирована следующим образом:

def doh():
    import nothing
    print "Homer says..."

Это ошибка, которую вы только что отправили, потому что doh никогда не вызывался в ваших модульных тестах, но он вызывается таким странным способом, о котором вы даже не думали. "Если бы я только импортировал, как сказал PEP8, у меня не было бы этой проблемы".

Другие вопросы по тегам