导入子modu时发生Python错误

2024-05-14 23:18:04 发布

您现在位置:Python中文网/ 问答频道 /正文

parent/__init__.py

    favorite_numbers = [1]

    def my_favorite_numbers():
        for num in favorite_numbers:
            num

    my_favorite_numbers()

    from .child import *

    my_favorite_numbers()

parent/child.py

^{pr2}$

然后我在父目录上创建了一个名为tst.py的文件:

    import parent

所以目录结构如下:

    parent (directory)
        __init__.py (file)
        child.py (file)
    tst.py (file)

我在执行时得到了这个错误:

    NameError: name 'favorite_numbers' is not defined

如何在中为收藏夹编号添加值儿童.py因此,当我执行my_favorite_numbers()函数时,我得到1和7。在


Tags: inpyimport目录childforinitmy
2条回答

在Python中,每个模块都有自己独立的全局变量。这实际上是模块的全部要点(与C预处理器样式的文本插入相反)。

当您执行from .child import *操作时,它将导入.child,然后将其所有全局变量复制到当前模块的全局变量中。它们仍然是独立的模块,有自己的全局变量。


如果要在不同模块中的代码之间传递值,则可能需要将该代码包装在函数中,然后将这些值作为函数参数和返回值传递。例如:

parent/__init__.py

from .child import *

favorite_numbers = [1]

def my_favorite_numbers():
    for num in favorite_numbers:
        num

my_favorite_numbers()

child_stuff(favorite_numbers)

my_favorite_numbers()

parent/child.py

^{pr2}$

实际上,除了初始化(定义函数和类、创建常量和其他单例函数等)之外,您几乎总是希望在函数中包装任何代码。当您import一个模块(包括from … import)时,它只在第一次运行其顶层代码。如果您再次import,那么模块对象已经存在于内存中(在sys.modules中),因此Python将只使用该对象,而不是再次运行代码来构建它。


如果您真的想将一个值推送到另一个模块的命名空间中,可以,但必须显式地执行。这意味着您必须通过导入模块对象,而不仅仅是从导入模块对象:

from . import child
child.favorite_numbers = favorite_numbers

但这绝不是个好主意。

你跑过吗设置.py或者一种“建立”你的图书馆的方法?

我会创造一个设置.py文件并可能在开发模式下运行它。Python setup.py develop vs install

相关问题 更多 >

    热门问题