在另一个函数中导​​入一个函数

时间:2018-09-25 18:36:11

标签: python python-3.x function python-import

让我们说我有一个脚本test.py,该脚本具有另一个功能中的功能:

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

     def function_2():
        return value

现在,我想在另一个脚本中同时使用function_1function_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 :(得分:2)

嵌套函数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与您在模块级别设置为3的x不同。

更新以进行更新

您绝对可以将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')