![](/img/trans.png)
[英]In terms of sys module dictionary, what happens when importing by using - package vs module?
[英]In terms of namespace, what happens when importing by using - package vs module?
我知道文件是模块,带有__init__.py
的文件夹是包。 我也知道有两种导入方法:
对于模块,第一种方法将整个模块(功能/变量)加载到被调用的模块名称空间中。 而第二种方法将函数/变量加载到调用模块的名称空间中。 也称为本地名称空间,而前一个称为全局名称空间吗?
这与使用软件包而不是模块有何不同? 我知道每次使用上面的选项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
的情况下,该函数/变量将加载到调用名称空间(本地名称空间?)中。
使用import
和from 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.