【问题标题】:How to import a nested function in a different file in python? [duplicate]如何在python的不同文件中导入嵌套函数? [复制]
【发布时间】:2026-02-07 03:00:01
【问题描述】:

我有一个名为main.py 的文件,其中包含以下代码:

def function(a):
     def inner_function(b):
           return b**2
     print("Reached here!")

现在我有一个名为test.py 的不同文件,我想从main.py 导入函数inner_function。目前我正在我的test.py 中执行此操作,但它不起作用:

from main import function
from function import inner_function

print(inner_function(2))

【问题讨论】:

  • 那行不通。你到底想做什么?见XY Problem
  • 由于词法范围规则,这是不可能的。你甚至不能从main.py 中使用inner_function,除非只能在function 内使用(它在内部是词法范围)。
  • 不仅仅是范围规则,它也不起作用,因为当您尝试使用它时,inner_function 甚至不存在
  • 内部函数仅在外部函数执行时存在,在导入时不存在。此外,导入语句不起作用,因为您一直在使用它。您不能从对象(如函数)导入,只能从模块和包导入。
  • 这通常只针对不需要保留在外部的 helper 函数。否则它应该在 module 级别。

标签: python function nested-function


【解决方案1】:

仅在运行外部函数中的代码时存在内部函数,因为调用了外部函数。这段代码在外部函数上可以正常使用内部函数,并且可以选择返回对内部函数的引用,或者将其分配给另一个数据结构(例如将其附加到列表中(外部函数)正在修改)。

因此,您给出的示例是 no-op - inner_funciton 什么都不做,即使调用了 function。它被创建,然后在调用print 后在function 退出时被销毁。

可以用内部函数做的事情之一是可以使用变量的函数工厂 - 可以简单地作为参数传递给外部函数。因此,这是 Python 中为可调用对象创建永久参数的另一种方式——另一种方式是使用类和实例。

因此,要使其正常工作,您的 function 必须在其 return 语句中返回 inner_function - 而且,如果除了工作之外,您还希望这有意义,那么您最好在里面有其他东西函数,inner_function 将使用 - 就像一个永久参数。

然后,在另一个模块上,导入 outer 函数并调用它 - 返回值是参数化的内部函数:

main.py:

def multiplier_factory(n):
   def inner(m):
       return n * m
   return inner

test.py:

from main import multiplier_factory

mul_3 = multiplier_factory(3)

print(mul_3(2))  # will print 6

【讨论】:

    【解决方案2】:

    正如其他评论者所建议的那样,Inner functions 被称为inner 是有原因的,因为它们只存在于它们定义的函数范围内,因此您的inner_functionfunction 之外不存在,这表示在main.py之外不存在,如下图

    In [12]: def function(a): 
        ...:      def inner_function(b): 
        ...:            return b**2 
        ...:      print("Reached here!") 
        ...:       
    
    #We can access function here
    In [13]: function(2)                                                                                                                                                              
    Reached here!
    
    #We cannot access inner_function here
    In [14]: inner_function(4)                                                                                                                                                        
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-14-11b6e7555d5a> in <module>
    ----> 1 inner_function(4)
    
    NameError: name 'inner_function' is not defined
    

    如果你真的要使用inner_function,我们可以从外部返回内部函数并使用它

    In [18]: def function(a): 
        ...:      def inner_function(b): 
        ...:            return b**2 
        ...:      print("Reached here!") 
        ...:      return inner_function 
        ...:                                                                                                                                                                          
    
    #func contains inner_function
    In [19]: func = function(4)                                                                                                                                                       
    Reached here!
    
    #We call inner_function via func
    In [20]: func(5)                                                                                                                                                                  
    Out[20]: 25
    

    此外,您只能从模块中导入类或函数,而不能像第二个导入语句那样从另一个函数中导​​入函数

    In [21]: from function import inner_function                                                                                                                                      
    ---------------------------------------------------------------------------
    ModuleNotFoundError                       Traceback (most recent call last)
    <ipython-input-21-1b1a859581c3> in <module>
    ----> 1 from function import inner_function
    
    ModuleNotFoundError: No module named 'function'
    

    所以使用inner_function的方式可以是

    main.py

    def inner_function(b):
        return b**2
    

    test.py

    from main import inner_function
    print(inner_function(2))
    

    【讨论】: