【问题标题】:Python naming conventions for modules模块的 Python 命名约定
【发布时间】:2009-04-02 22:31:35
【问题描述】:

我有一个模块,其目的是定义一个名为“nib”的类。 (还有一些相关的类。)我应该如何调用模块本身? “笔尖”? “笔尖模块”?还有什么?

【问题讨论】:

    标签: python naming-conventions


    【解决方案1】:

    只是笔尖。使用大写 N 命名类 Nib。有关命名约定和其他样式建议的更多信息,请参阅 Python 样式指南 PEP 8

    【讨论】:

    • 大多数 Python 项目都遵循这个约定吗?因为我注意到内置类是小写的,例如列表、字符串等
    • 你观察 w.r.t.内置类型是正确的。不过,这些绝对是例外。标准库中定义的大多数其他类都是大写的。
    • 我认为这是正确的约定,但它有一个固有的问题,至少在我看来。假设我有一个名为Client 的类,可以理解的是,我经常会创建我想调用client 的实例。但是根据您的约定,模块名称将是client,因此我总是必须将我的实例命名为不自然的名称,例如client_instance。您如何看待这个问题?
    • @Ray 但是如果约定将模块命名为Client,那么它会与类名Client 发生冲突。由于只有 3 种可能的命名变体(clientClientCLIENT),因此实例、类、模块或常量中的两个之间总是会发生冲突。我相信与类相比,您将模块命名为实例或常量的次数更少,因此是其他可能性的更好命名约定。它还会使从模块导入更具可读性,因为您通常导入类和常量而不是变量。
    • 内置函数是小写的原因是暗示它们是用C而不是python实现的。
    【解决方案2】:

    我会称之为 nib.py。而且我还会将这个类命名为 Nib。

    在我正在处理的一个更大的 python 项目中,我们有很多模块,基本上定义了一个重要的类。类以大写字母开头。模块以小写的类命名。这会导致如下导入:

    from nib import Nib
    from foo import Foo
    from spam.eggs import Eggs, FriedEggs
    

    这有点像模仿 Java 的方式。每个文件一个类。但是有了额外的灵活性,如果有意义的话,您总是可以将另一个类添加到单个文件中。

    【讨论】:

      【解决方案3】:

      我知道从pythonic的角度来看我的解决方案不是很流行,但我更喜欢使用一个模块->一个类的Java方法,模块命名为类。 我确实理解 python 风格背后的原因,但我不太喜欢拥有一个包含很多类的非常大的文件。尽管可以折叠,但我发现浏览起来很困难。

      另一个原因是版本控制:拥有大文件意味着您的提交往往会集中在该文件上。这可能会导致需要解决的冲突数量更多。您还会丢失提交修改特定文件(因此涉及特定类)的附加日志信息。相反,您会看到对模块文件的修改,只有提交注释才能了解所做的修改。

      总结一下,如果您更喜欢 Python 哲学,请参考其他帖子的建议。如果您更喜欢类似 java 的理念,请创建一个包含类 Nib 的 Nib.py。

      【讨论】:

      • 所提到的问题是由编辑器的限制和版本控制工具的使用造成的,而不是语言或编程风格。每个文件一个类对代码结构有害。使用spyder 或类似的编辑器查看类的摘要以帮助导航,并在两个窗格上打开具有相同文件的两个窗格。另外,请阅读 PEP8。 Python 用于编写 Python,Java 用于 Java,但 Python 不是 用于编写 Java。
      • @IoannisFilippidis:如果我必须以我通常管理的代码大小将模块的所有类放在一个文件中,我什至无法打开该文件,与其他同事的冲突会激增,我的老板会因为提出这个建议而朝我脸上吐口水(形象地说,就是这样)。单个文件方法无法扩展,无论 PEP-8 与否。
      • @StefanoBorini:PEP8 不需要单一文件方法。每个模块一个类,每个(代码单元)一个文件是非常广泛的两个极端。如果您发现每个模块只有一个文件的大文件大小难以管理,您或许应该考虑修改将包分解为模块的方法。
      【解决方案4】:

      笔尖很好。如有疑问,请参阅 Python 样式指南。

      来自PEP 8

      包和模块名称 模块应该有简短的全小写名称。可以使用下划线 如果它提高了可读性,则在模块名称中。 Python 包应该 也有简短的全小写名称,尽管使用下划线是 气馁。

      由于模块名称映射到文件名,并且某些文件系统是 不区分大小写并截断长名称,重要的是模块 名称选择相当短——这在 Unix 上不是问题, 但是当代码传输到旧的 Mac 或 Windows 版本,或 DOS。

      当使用 C 或 C++ 编写的扩展模块具有随附的 Python 时 提供更高级别的模块(例如更面向对象) 接口,C/C++ 模块有一个前导下划线(例如_socket)。

      【讨论】:

        【解决方案5】:

        来自PEP-8: Package and Module Names

        模块应该有简短的全小写名称。下划线可以 如果它提高可读性,则在模块名称中使用。

        Python 包 也应该有简短的全小写名称,尽管使用 不鼓励使用下划线。

        当一个用 C 或 C++ 编写的扩展模块有一个伴随 提供更高级别的 Python 模块(例如,更面向对象) 接口,C/C++ 模块有一个前导下划线(例如_socket)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-14
          • 2012-07-20
          • 2011-09-13
          • 2013-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多