繁体   English   中英

在名称空间方面,使用-包vs模块导入时会发生什么?

[英]In terms of namespace, what happens when importing by using - package vs module?

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

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

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

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

使用importfrom import时,我对名称空间的调用方(本地)和调用方(全局)的理解正确吗?

从技术上讲, ___init__.py在Python 3.4之后不再是必需的。 但是建议您使用它。 要回答您的问题,如果您执行的是仅导入文件的幼稚导入,则该模块/程序包中的所有内容都会加载到名称空间中。 对于使用from语法的特定导入,将加载特定的类/函数。 区别在于,对于包而言,如果__init__.py中有任何代码会自动加载到名称空间中。 假设您有一个使用模块名称进行记录的记录器,

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__)

现在,记录器已绑定到程序包名称空间,希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM