from module import function称为FMIF编码样式。

import module称为IM编码样式。

from package import module称为FPIM编码样式。

为什么IM + FPIM被认为比FMIF更好的编码风格? (有关此问题的灵感,请参见this post。)

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

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

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

    我对IM + FPIM可能比FMIF更好的所有原因感兴趣,
    但特别是,我将对mentioned here以下几点感兴趣:

    IM的优点:
  • 易于在测试中进行模拟/注入(inject)。 (尽管我最近对模拟不是很熟悉,但是我最近才了解该术语的含义。在这里,您可以显示代码证明IM优于FMIF的代码吗?)
  • 通过重新定义一些条目来灵活更改模块的能力。 (我一定会误会,因为这似乎是FMIF相对于IM的优势。请参见上面支持FMIF的第三个理由。)
  • 序列化和恢复数据时的可预测和可控制的行为。 (我真的不明白IM或FMIF的选择如何影响此问题。请详细说明。)

  • 我知道FMIF会“污染我的 namespace ”,但是除了听起来不是一个否定的短语之外,我不喜欢这会如何以任何具体的方式伤害代码。

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

    非常感谢。

    最佳答案

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

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

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

    我喜欢FPIM,因为使用乘法限定名称而不是单限定名称确实没有太多附加值(而裸名和限定名称之间的差异很大-您会得到,因此对限定名称的控制更多单数或乘数,比起使用裸名可能要多!)。

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

    08-27 06:20