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

“导入模块”的编码样式是否比“来自模块导入功能”的编码样式更好?

钮轩昂
2023-03-14
问题内容

from module import function被称为FMIF的编码风格。

import module被称为IM的编码风格。

from package import module被称为FPIM的编码风格。

为什么IM +FPIM被认为比FMIF更好的编码风格?(有关此问题的启发。)

以下是一些使我更喜欢FMIF而不是IM的条件:

  1. 代码的简短性:它使我可以使用较短的函数名称,从而有助于遵循每行80列的约定。
  2. 可读性:chisquare(...)比更具可读性 scipy.stats.stats.chisquare(...)。尽管这是一个主观标准,但我认为大多数人都会同意。
  3. 易于重定向:如果我使用FMIF,并且由于某些原因在以后的某个时间想要重定向python来定义functionalt_module而不是module我只需要更改一行:from alt_module import function。如果要使用IM,则需要更改许多代码行。

我意识到FPIM可以使前两个问题无效,但是第三个问题又如何呢?

我对IM +
FPIM可能比FMIF更好的所有原因都感兴趣,但是特别是,我对这里提到的以下几点感兴趣:

IM的优点:

  1. 易于在测试中进行模拟/注入。(尽管我最近对模拟并不十分熟悉,但是我最近才了解该术语的含义。在这里,您可以显示代码证明IM优于FMIF的代码吗?)
  2. 通过重新定义一些条目,模块可以灵活更改的功能。(我一定会误会,因为这似乎是FMIF相对于IM的优势。请参见上面支持FMIF的第三个理由。)
  3. 有关数据序列化和恢复的可预测和可控制的行为。(我真的不明白IM或FMIF的选择如何影响此问题。请详细说明。)
  4. 我了解FMIF会“污染我的名称空间”,但是除了听起来像是一个否定性的短语外,我不明白这会如何以任何具体方式伤害代码。

PS。在撰写此问题时,我收到警告,该问题看起来很主观,很可能已被关闭。请不要关闭它。我并不是在寻找主观意见,而是要寻找IM +
FPIM比FMIF更好的具体编码情况。

非常感谢。


问题答案:

您为IM / FPIM列出的否定词通常可以通过适当使用as子句来改善。 from some.package import mymodulewithalongname as mymod可以有效地缩短代码并提高其可读性,如果重命名mymodulewithalongnamesomethingcompletelydifferent明天,则该as子句可以用作单个语句进行编辑。

考虑您的FMIF前点3(重定向时称为R)与FPIM的前点2(灵活性时称为F):R等于促进模块边界完整性的丧失,而F则增强了模块边界的完整性。模块中的多个函数,类和变量通常旨在协同工作:不应将它们独立切换为不同的含义。例如,考虑模块random及其功能seed以及uniform:如果要将其中一个的导入切换到其他模块,则将中断对的调用seed与对的调用结果之间的常规连接uniform。当一个模块设计得很好,具有内聚力和完整性时,R打破模块边界的便利实际上是不利的-
它使您做得更好的事情变得更容易 这样做。

反之亦然,F使耦合的函数,类和变量(因此,通常,通过模块化 属于 同一实体的实体)之间的 协调
切换成为可能。例如,要使测试可重复(FPIM要点1),请在模块中和两者同时进行模拟,如果代码遵循FPIM,则一切就绪,可以保证协调。但是,如果您有直接导入函数的代码,则必须查找每个此类模块,并一遍又一遍地重复模拟。要使测试完全可重复,通常还需要对日期和时间函数进行“协调模拟”-如果在某些模块中使用,则需要查找并模拟所有这些(以及所有进行模拟的模拟)
__seed``random``random``from datetime import datetime``from time import time,依此类推),以确保当系统的各个部分询问“现在几点了?”时收到的所有时间。完全一致(如果使用FPIM,则只需模拟两个相关模块)。

我喜欢FPIM,因为通过使用有真的没有太多的附加价值 乘以 合格的名称,而不是一个单独合格的一个(而barenames和合格的名称之间的差异是
巨大的 -你会得到 这样 一个合格的名字更多的控制,无论是单或成倍增加,比起用一个裸名!

嗯,不能把所有的工作时间都花在回答您的每一个问题上-您的问题可能应该是六个问题;-)。我希望这至少能解决“为什么F比R更好”以及一些模拟/测试问题-归结为
维护和增强设计良好的模块化 (通过F)而不是破坏(通过R)。



 类似资料:
  • 问题内容: 我已尝试找到有关最佳使用还是全面的指南。我刚开始使用Python,并且正在尝试着眼于最佳实践。 基本上,我希望有人能分享他们的经验,其他开发人员有什么喜好,以及避免遇到麻烦的最佳方法是什么? 问题答案: 和之间的区别主要是主观的。选择最喜欢的一个,并在使用中保持一致。这里有一些要点可以帮助你做出决定。 优点: - 减少维护你的import报表。无需添加任何其他导入即可开始使用模块中的另

  • 本文向大家介绍你是怎样抽离样式模块的?相关面试题,主要包含被问及你是怎样抽离样式模块的?时的应答技巧和注意事项,需要的朋友参考一下 说的是 webpack + extract-text-webpack-plugin插件吧? 把样式文件单独打包出来。 webpack4 升级了插件为 mini-css-extract-plugin

  • 根据这个答案,您可以使用来使用类似这样的相对导入: 为什么相对导入不适用于sklearn。特征提取。文本 我验证了是一个具有以下功能的模块: 编辑 “不工作”,我的意思是它不导入模块。 我正在使用Python 3.4 绝对方式工作: 相对方式不:

  • 问题内容: 我经常在我的Swift应用程序中使用第三方Swift框架,并且希望使用它而不必一遍又一遍地写每个Swift文件。 有没有办法指定默认导入,就像使用文件在Objective-C中那样? 我已经检查了Xcode的构建设置和标志,但是没有一个提供此功能。 问题答案: 实际上,有一个我之前可以想到的非常简单的解决方法…… 只需将以下内容添加到应用程序项目的Objective-C桥接标头中: 斯

  • 主要内容:导入模块方式一:临时添加模块完整路径,导入模块方式二:将模块保存到指定位置,导入模块方式三:设置环境变量很多初学者经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用 import(或 from...import) 语句引入该文件时,Python 解释器同时如下错误: ModuleNotFoundError: No module named '模块名' 意思是 Python 找不到这个模块名,这是什么原因导致的呢?要想解决这个问题,读者要先搞清楚 Python 解释器查找

  • 我不认为任何一种语言在导入其他源文件这样简单的事情上会像python那样让人头疼。所以问题是:我的模块导入是否需要依赖于代码的运行方式? 我有以下目录结构: 我希望从包中的另一个模块导入包中的一个模块。简单? 因此,我在中添加了以下内容: 现在,如果我从目录中运行,就可以正常工作了。另外,如果我返回一个目录并调用就可以了。看起来像是python搜索相对于给定文件的导入模块。 我看了很多资料,包括这