Как избежать NameError при вызове функции из другой функции в том же скрипте? - PullRequest
0 голосов
/ 23 апреля 2019

Я использую модуль scipy.optimize для подгонки параметров к измерениям. Функции требуют много переменных, которые я определил в основном пространстве имен. Хотя все функции находятся в одном файле, я все равно получаю NameError.

Ошибка появляется только при использовании функции параллельной обработки с использованием аргумента workers для differential_evolution.

Ошибка исчезает, если я не использую функцию workers. Если я явно передаю переменные в функции, они также исчезают.

Следующий код генерирует ошибку NameE:

import scipy.optimize


def optimize_parameters():
    solution = scipy.optimize.differential_evolution(error, bounds=[[0, 1], [0, 1], [0, 1], [0, 1]], workers=4)
    print(solution.x)


def error(x):
    parameter_dict.update(zip(parameter_list, x))
    return complex_error_calculation()


def complex_error_calculation():
    return parameter_dict['a'] * 10 + parameter_dict['b'] * 5 - parameter_dict['c'] * 2 + parameter_dict['d']


if __name__ == "__main__":
    parameter_list = ['a', 'b', 'c', 'd']
    parameter_dict = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
    optimize_parameters()

Выход:

NameError: name 'parameter_dict' is not defined

Если я внесу изменения в вызовы функций, код будет работать, как и ожидалось

import scipy.optimize

def optimize_parameters():
    solution = scipy.optimize.differential_evolution(error, bounds=[[0, 1], [0, 1], [0, 1], [0, 1]],
                                                     args=[parameter_dict, parameter_list])
    print(solution.x)


def error(x, parameter_dict, parameter_list):
    parameter_dict.update(zip(parameter_list, x))
    return complex_error_calculation(parameter_dict)


def complex_error_calculation(parameter_dict):
    return parameter_dict['a'] * 10 + parameter_dict['b'] * 5 - parameter_dict['c'] * 2 + parameter_dict['d']


if __name__ == "__main__":
    parameter_list = ['a', 'b', 'c', 'd']
    parameter_dict = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
    optimize_parameters()

Я бы хотел, чтобы код выполнялся параллельно, и есть обходной путь, чтобы код работал параллельно. Это как запутанное решение. Я хотел бы понять, почему я получаю NameError, я использую рабочую функцию и питонский способ решения этой проблемы.

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