gpt4 book ai didi

python - 从文件导入特定类而不是完整文件重要吗?

转载 作者:行者123 更新时间:2023-12-01 08:10:53 28 4
gpt4 key购买 nike

大多数有关 Django 或 Flask 的教程和书籍都从文件中导入特定的类,而不是导入整个文件。
例如,从 wrtforms.validators 导入 DataRequiered 验证器是通过 from wtforms import validators 完成的,而不是通过 import wtforms.validators 导入的作为 valids,然后使用 valids.DataRequiered 访问 DataRequiered

我的问题是:这有什么原因吗?

我想到了避免加载整个模块以进行计算/内存优化(这真的相关吗?)?或者只是为了让代码更具可读性?

最佳答案

My question is: Is there an reason for this ?

from module_or_package import something是规范的 pythonic 习惯用法(当然,当您只想在当前 namespace 中导入 something 时)。

此外,import module_or_package.something仅适用于 module_or_package是一个包并且 something一个子模块,它会引发 ImportError(No module named something)如果somethingmodule_or_package 中定义的函数、类或任何对象,如在 stdlib 中所示 os.path (这是 os.package 的子模块)与 datetime.date (这是 datetime 模块中定义的类):

>>> import os.path as p
>>> p
<module 'posixpath' from '/home/bruno/.virtualenvs/blook/lib/python2.7/posixpath.pyc'>

对比

>>>import datetime.date as d
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named date

thought to something like avoiding the loading a whole module for computation/memory optimization (is it really relevant?)

完全不相关 - 从模块导入给定名称需要导入整个模块。实际上,这个:

from module_or_package import something

只是语法糖

import module_or_package
something = module_or_package.something
del module_or_package

编辑:您在评论中提到

Right, but importing the whole module means loading it to the memory, which can be a reason for importing only a submodule/class

所以看来我没能阐明这一点:在Python中,你不能“仅导入子模块/类”,句号。

在Python中,import , classdef都是可执行语句(实际上只是您可以使用函数和类“手动”执行操作的语法糖)。导入模块实际上包括执行模块顶层的所有代码(这将实例化 functionclass 对象)并创建 module对象(module类型的实例),其属性将是通过import在顶层定义的所有名称。 , defclass语句或通过显式赋值。只有当所有这些都完成后,您才能访问模块中定义的任何名称,这就是为什么,正如我上面所说的,

from module import obj

只是语法糖

import module
obj = module.obj
del module

但是(除非你做了一些愚蠢的事情,比如在模块中定义一个 TB 级的巨大字典或列表),这实际上并不需要那么多时间,也不会消耗太多内存,并且模块只是有效地执行 每个进程第一次导入时一次 - 然后它被缓存在 sys.modules 中因此后续导入仅从缓存中获取它。

此外,除非您主动阻止,否则 Python 将缓存模块的编译版本(.pyc 文件),并且仅在 .pyc 丢失或早于源 .py 文件时才重新编译它。

wrt/包和子模块,导入子模块也会执行包的__init__.py并建立一个module来自它的实例(IOW,在运行时,包也是 module )。包初始值设定项通常相当短,而且实际上通常是空的 FWIW...

关于python - 从文件导入特定类而不是完整文件重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55260308/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com