为什么python导入模块在导入时导入*
假设我有一个文件,其中我正在导入一些包:为什么python导入模块在导入时导入*,python,import,python-import,Python,Import,Python Import,假设我有一个文件,其中我正在导入一些包: # myfile.py import os import re import pathlib def func(x, y): print(x, y) 如果我进入另一个文件并输入 from myfile import * 它不仅导入func,而且还导入os、re和pathlib 但是我不希望在我执行import*时导入这些模块 为什么要导入我正在导入的其他软件包?您如何避免这种情况 from myfile import func 这是解决方
# myfile.py
import os
import re
import pathlib
def func(x, y):
print(x, y)
如果我进入另一个文件并输入
from myfile import *
它不仅导入func
,而且还导入os
、re
和pathlib
但是我不希望在我执行import*
时导入这些模块
为什么要导入我正在导入的其他软件包?您如何避免这种情况
from myfile import func
这是解决方法:)
当您导入*时,您将从导入所有内容。其中包括您在源文件中导入的内容。原因
因为import
导入命名空间中的每个名称。如果模块中有某个名称,则导出该名称是有效的
如何避免
首先,您几乎不应该使用import*
。导入您试图使用的特定方法/变量(从模块导入func
)或导入整个模块并通过点符号访问方法/变量(导入模块;…;模块.func()
)几乎总是更清晰的代码
也就是说,如果必须使用import*from module
,有几种方法可以防止从module
导出某些名称:
import*from…
不会导入以开头的名称。它们仍然可以直接导入(即从模块导入_name
),但不能自动导入。这意味着您可以重命名导入,使其不会被导出,例如,将操作系统导入为_os
。但是,这也意味着该模块中的整个代码必须引用\u os
,而不是os
,因此您可能需要修改大量代码
\uuuu all\uuuu:List[str]
,则import*
将仅导出该列表中包含的名称。在您的示例中,将行添加到myfile.py
,然后import*
将只导入func
实际上已经讨论过了,但为了简化,我将自己回答
from import*
是一种导入特定模块/包中所有名称的方法。通常,由于这个原因,每个人实际上都不会使用import*
,而是坚持使用import
Python的import
基本上只是运行指向导入的文件(虽然不是那么简单,但足够接近)。因此,如果您导入一个模块,它也将导入该模块导入的所有内容。如果只想导入模块中的特定函数,请尝试:
从myfile导入函数
…只导入
myfile.func()
而不导入其他内容。恭喜,您找到了不使用import*
的众多原因之一。停止使用它!这回答了你的问题吗<代码>为什么要导入我正在导入的其他软件包?您如何避免这种情况?如果软件包上的所有东西(因此导入*
)在没有这些库的情况下都能正常工作,为什么要导入它们?如果不需要导入这些,为什么要将它们放在您正在导入的模块中?如果你想从你的模块中导入依赖它们的东西,为什么你不想导入那些依赖它们的模块呢?这正是我想要的。如果我只是导入我的文件,我就不想再导入其他东西(比如在本例中的re、os或pathlib)