Проблема с импортом файлов .py в Python - PullRequest
0 голосов
/ 16 декабря 2018

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

У меня есть файл с определенными функциями, давайте назовем этот файл main_functions.py.

В этом файле я полагаюсь на функцию, которую мы можемЗвоните foo().Например, в файле main_functions.py у нас может быть что-то вроде этого:

def bar():
    return foo()

foo() определен в другом файле, который называется secondary_functions.py

def foo():
    return 1

Теперь, вмой сценарий main, я хотел бы импортировать файл, в котором я могу определить foo(), а затем сделать что-то вроде:

from secondary_functions import *    # Here I define foo()
from main_functions import *  

bar()

Если я сделаю это, функция внутри main_functions не сможетчтобы найти определения, которые присутствуют в secondary_functions, и я получу ошибку вроде:

NameError: имя 'foo' не определено

Это оченьДля меня важно решить эту проблему.

Моя цель - иметь возможность иметь разные файлы с именами secondary_functions1.py, secondary_functions2.py, eccetera, определения foo().

И, чтобы решить проблему, я не хочу каждый раз менять файл, который зависит от этих определений, например вставлять каждый раз что-то вроде import secondary_functionsX.py, что решило бы проблему.Я хотел бы изменить только основной скрипт.

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

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

Таким образом, единственный способ сделать это - явное «присвоение» значений вашему модулю, например, в качестве дополнительных аргументов функции.Вы можете поместить все, что находится в main_functions.py, в класс, а затем сделать так, чтобы ваш главный скрипт дал ему требуемые глобальные переменные в качестве аргументов своей функции построения init, чтобы он мог сохранять их для использования bar() и другими методами.

0 голосов
/ 16 декабря 2018

Имя foo импортируется в main.py.foo недоступно в модуле main_functions.py, потому что вы не импортировали его в этот модуль.См. Пространства имен с импортом модулей для получения дополнительной информации о том, почему он работает таким образом.

Один из способов сделать то, что вы хотите, это предоставить foo в качестве аргумента bar().Пример:

main.py:

from secondary_functions import foo
from main_functions import bar 

bar(foo)

main_functions.py:

def bar(foo):
    return foo()

primary_functions.py:

def foo():
    return 1
0 голосов
/ 16 декабря 2018

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

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

Другая проблема, которая может быть проблемой, заключается в том, что вы определяете pippo внутри функции, которая затем делает ее локальной переменной только для этой функции.

И последняя проблема, о которой я могу подумать, этоесли вы используете их в main_functions, и они не были определены в main_functions, и вы не импортируете файлы в main_functions, т.е. # in main_functions.py<br> import secondary_functions

, то я не думаю, что main_functions сможет найтифункция и переменная без указания аргументов для функции, в которой вы их используете. Или снова вы можете сделать что-то вроде file.pippo

...