Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python导入模块在导入时导入*_Python_Import_Python Import - Fatal编程技术网

为什么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)