在名称空间方面,使用package vs module导入时会发生什么?

2024-04-18 10:13:46 发布

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

我知道文件是一个模块,带有__init__.py的文件夹是一个包。我还知道有两种导入方法:

  • 导入x(x可以是包或模块)
  • 从x导入y(x可以是包或模块;如果x是包,则y可以是子包或模块;如果x是包.模块那么y可以是函数/变量

对于模块,第一种方法将整个模块(函数/变量)加载到被调用的模块名称空间中。而第二种方法将函数/变量加载到调用模块的命名空间中。这个名称空间也称为本地名称空间,前面的名称空间称为全局名称空间吗?你知道吗

这与使用包而不是模块有什么不同?我知道每次使用上面的选项a或b导入包时,_init__.py都会被调用。但是在case a中,只有pkgname被加载到调用模块命名空间(local namespace?)中。在调用/被调用的包命名空间中没有加载任何模块[除非init文件导入了模块];而在case b中,该特定模块/变量是否加载在被调用的命名空间(全局命名空间)中?如果是from package import module(本地名称空间?),我想是的。如果是from package import anotherpackage,则为no(取决于该包是否像前面的示例一样具有带有导入的init文件)。在from package.module import function/variable的情况下,函数/变量被加载到调用名称空间(本地名称空间?)。你知道吗

在使用importfrom import时,我对调用方(local)和被调用方(global)在命名空间方面的理解是否正确?你知道吗


Tags: 模块文件方法函数frompyimport名称
1条回答
网友
1楼 · 发布于 2024-04-18 10:13:46

从技术上讲,___init__.py在python3.4之外不再是强制性的。但建议你用它。 为了回答您的问题,如果您执行一个只导入文件的简单导入,那么该模块/包中的所有内容都将加载到名称空间中。 对于使用from语法的特定导入,将加载特定的类/函数。 不同之处在于,在包的情况下,如果在uu init\uuuuy.py中有任何代码,get会自动加载到名称空间中。假设您有一个使用模块名进行日志记录的记录器

def get_module_logger(name=None):
    default = "__app__"
    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s",
        handlers=[
            logging.FileHandler("logs/run_{}.log".format(str(datetime.today().strftime('%Y-%m-%d')))),
            logging.StreamHandler()
        ])
    logger = logging.getLogger(name) if name else logging.getLogger(default)
    return logger

可以在包中的任何模块中使用调用

import get_module_logger

可以在代码的任何地方引用

logger = get_module_logger(__name__)

现在记录器被绑定到包名称空间 希望这有帮助。你知道吗

相关问题 更多 >