Почему порядок импорта файлов разрешает ошибку NameError? - PullRequest
0 голосов
/ 04 октября 2019

У меня есть три файла, один из которых является основным файлом, который нужно запустить, а два других содержат служебные функции, как показано ниже. Все файлы находятся в одном каталоге, и я запускаю его на PyCharm.

# delta_plots.py - This is the main file
...
from delta_plots_utility_1 import *
from delta_plots_utility_2 import *
...

def print_parameter_header(params, flag):
    batch_size, epochs, lr = params[0], params[1], params[2]
    print("{} - Batch size: {}, Epochs: {}, Learning rate: {}".
         format(flag.upper(), batch_size, epochs, lr))
...

if __name__ == '__main__':
    # call the utility functions based on a condition
    if (condition1):
        utility_function_1()
    elif (condition2):
        utility_function_2()
# delta_plots_utility_1.py - Utility file 1

# this import statement is to import the print_parameter_header() function 
# from the main file
from plot_delta_mp import *

def utility_function_1():
    # this function makes a call to the print_parameter_header() function
    ...
    print_parameter_header(params, flag)
    ...
# delta_plots_utility_2.py - Utility file 2

from plot_delta_mp import *

def utility_function_2():
    # this function also makes a call to the print_parameter_header() function
    ...
    print_parameter_header(params, flag)
    ...

Проблема в том, что в основном файле, если условие1 истиннозатем я вынужден поместить оператор импорта для служебного файла 1 перед оператором импорта для служебного файла 2, и наоборот.

В противном случае я получаю следующую ошибку: NameError: name 'print_parameter_header' is not defined

Я также попытался импортировать файлы как модули и затем получить доступ к функции как module.print_parameter_header(), но это тоже не помогает.

У меня были следующие вопросы по этому поводу:

  1. Из чегоЯ так понимаю, порядок импортных выписок не важен. Так почему это происходит? Почему изменение порядка разрешает ошибку?
  2. Может ли это быть из-за цикличного импорта? Поскольку я также импортирую основной файл в функции утилиты.
  3. Если да, то можно ли определить print_parameter_header() в файлах утилиты? Хотя это было бы излишним, это хорошая практика?

1 Ответ

1 голос
/ 04 октября 2019

Кажется, что все ваши проблемы возникают из-за первоначального недоразумения: «Из того, что я понимаю, порядок операторов импорта не важен».

В python оператор импорта

  • может произойти где угодно в коде (не обязательно в начале), поэтому, если вы сталкиваетесь с проблемами циклической зависимости, было бы неплохо импортировать последние возможные варианты, если у вас нет другого выбора дизайна
  • создает символы в коде. Таким образом, from xxx import a создаст переменную a локально, так же, как и запись a = 0. Это точно так же.

Так что, возможно, хорошим решением для вас было бы прекратить использование from <xxx> import * или import <xxx>, которые оба импортируют все символы из другого модуля. , но для импорта выбранных символов в точно контролируемых местах. Например, from <xxx> import a, b и позже в вашем коде from <xxx> import c.

Извините, что не нашли время адаптировать приведенный выше ответ к вашему примеру с точным кодом, но, надеюсь, вы поймете идею.

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