Импорт функции внутри другой функции - PullRequest
0 голосов
/ 25 сентября 2018

Допустим, у меня есть скрипт, test.py, у которого есть функция, которая входит в другую функцию:

 x = 3
 def function_1(x):
     ...
     y = x + 7

     def function_2():
        return value

Теперь я хочу использовать как function_1, так и function_2 в другом скрипте.,Как мне это сделать?

Я пробовал это:

import test
from test import function_1
from function_1 import function_2

Я просто получаю сообщение об ошибке No module named function_1.Он импортирует function_1, и я могу использовать его, но не function_2.Я не могу просто сделать function_1 классом (для этого нужен параметр).Как я могу это исправить?Можно ли как-нибудь использовать _main_ для замены function_1?Могу ли я импортировать только function_2?

1 Ответ

0 голосов
/ 25 сентября 2018

Вложенная функция function_2 - это объект в local пространстве имен внешней функции.Он даже не существует как функция, когда function_1 не запущен.

Обычно вложенная функция выполняет вычисление private для внешней функции или возвращается в некоторой форме.или другой.В последнем случае вы можете запустить function_1, чтобы получить ссылку на function_2.

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

x = 3

def function_1(x):
    y = x + 7
    # Do some stuff, including using function_2
    return y

def function_2(value):
    # Do some stuff
    return value

И имейте в виду, что определение функции - это не то же самое, что запуск .Как следствие, x внутри function_1 отличается от x, установленного на уровне 3 на уровне модуля.

Обновление для вашего обновления

Вы абсолютно можете превратить function_1 в класс и сделать из него function_2 метод:

class function_1:
    def __call__(self, x):
        y = x + 7
        value = self.function_2(y)
        return y, value

    @staticmethod
    def function_2(value):
        return value

В этом случае вы можете сделать следующее в вашем другом скрипте:

from test import function_1

f1 = function_1()
# Call it:
f1(7)
# Call function_2:
function_1.function_2('blah')
# Or alternatively:
f1.function_2('foo')
...