当前位置: 首页 > 面试题库 >

在模块级别或功能级别导入?

严修谨
2023-03-14
问题内容

哪种风格更好?

风格A:

def foo():
    import some_module
    some_module.something

风格B:

import some_module

def foo():
    some_module.something

假设some_module 在代码的其他地方没有使用,仅在此函数内部使用。


问题答案:

确实,如前所述,通常最好遵循PEP 8的建议,并在顶部进行导入。虽然有一些例外。理解它们的关键在于您在第二段中嵌入的问题:“导入在哪个阶段发生?”

导入实际上是一个可执行语句。导入模块时,模块中的所有可执行语句都会运行。“
def”也是可执行的语句;它的执行将使定义的名称与(已编译的)代码相关联。因此,如果您有:

def f():
    import something
    return None

在您导入的模块中,(已编译的)import和return语句此时与名称“ f”相关联。当您 运行 f()时,导入语句将运行。

如果您推迟导入“非常大”或“繁重”的东西,然后再也不运行该函数(在本例中为f),则导入永远不会发生。这样可以节省时间(以及一些空间)。当然,一旦您实际调用f(),导入就会发生(如果Python使用缓存的结果已经完成了导入,但是仍然需要检查),那么您将失去时间优势。

因此,根据经验,在完成大量分析后发现“导入所有内容”会浪费90%的运行时间,而在进行大量分析后才发现,导入“巨大的东西”会浪费大量时间其中的10%。



 类似资料:
  • 假设您的代码正在使用一个模块,该模块使用来自该模块的的日志语句,而不是来自记录器实例的,并且您没有控制权来修改该模块正在使用中。 是否可以在不要求维护者修改代码的情况下为导入的模块自定义日志级别? 这些问题描述了一种非常简单的方法来更改特定模块的日志记录级别 如何禁用来自请求库的日志消息 Python日志记录-禁用导入模块的日志记录 下面的代码实现了所述的解决方案,只记录来自该模块的错误消息,但它

  • 问题内容: 如何引用常量而不是函数级别变量? 问题答案: 你不能 当局部变量在作用域内时,名称表示局部变量。并且没有“限定符”来引用顶级标识符。 规格:声明和范围: 可以在内部块中重新声明在块中声明的标识符。内部声明的标识符在范围内,它表示内部声明声明的实体。 如果您需要同时访问顶级常量/变量和局部变量,请使用不同的名称。 如果由于某种原因您不愿意或不想这样做,可以先保存顶级常量或变量的值: 或者

  • 问题内容: 这是我的包裹层次结构 现在我要导入里面。所以我给了 app1.py。 但是我收到以下错误: 我还应该提到我是从server.py导入app1.py的。是我实际上正在运行的文件。当server.py导入app1.py时,尝试导入时出现上述错误 我在这里做错了什么? 问题答案: 如果您以脚本运行,则不会将的父目录添加到中。该目录本身,而不是被添加(而不是作为一个包,但作为进口搜索路径)。

  • 问题内容: 我在某处读过该元素的行为类似于两者。如果正确,可以有人举例说明吗? 问题答案: 的确,它们都是-或更确切地说,它们是“内联块”元素。这意味着它们像文本一样内联地流动,但也像块元素一样具有宽度和高度。 在CSS中,您可以设置一个元素以使其复制图像的行为*。 图像和对象也被称为“已替换”元素,因为它们本身不具有内容,因此该元素实际上被二进制数据替换。 *请注意,浏览器在技术上使用(如在开发

  • 问题内容: 在Elasticsearch中进行等效于SQL连接的最佳方法是什么? 我有一个带有两个大表的SQL安装程序:Persons和Items。一个人可以拥有 许多 物品。人员和项目行都可以更改(即更新)。我必须运行按人员和项目方面进行筛选的搜索。 在Elasticsearch中,您似乎可以使Person成为Item的嵌套文档,然后使用。 但是:如果您随后更新一个Person,我认为您需要更新

  • 我们的项目使用Gradle 3.5,jacoco 0.8.1 它有3个模块--module-A、module-B、module-C,代码覆盖率分别为50%、6%和42%,整个项目的代码覆盖率为38%。 我在Jacoco Gradle中尝试了最小代码覆盖阈值的解决方案 但失败了,提示模块-B违反了规则,指令覆盖率为0.06,而expect为0.38,似乎只适合模块级,而不适合整个项目级。 我还尝试使