Python类文件名是否也应该是camelCased?

m4j*_*sun 33 python filenames camelcasing naming-conventions

我知道Python中的类通常使用camelCase.

如果文件只包含类,那么包含该类的文件也是camelCase也是常规约定吗?

例如,是否应该将类className存储在?className.py而不是class_name.py

Cai*_*ver 33

以下答案主要来自这个答案.

如果您要遵循PEP 8,您应该坚持全小写名称,并带有可选的下划线.

引用PEP 8的包和模块的命名约定:

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

对于课程:

类名通常应使用CapWords约定.

有关模块,类和包之间的区别,请参阅此答案:

Python模块只是一个Python源文件,它可以公开类,函数和全局变量.

  • @guival我认为是单一的,但一般规则可能有例外。我不知道像 PEP 这样关于复数的官方内容,但您可以找到有关命名风格最佳实践的其他讨论,例如:https://softwareengineering.stackexchange.com/questions/75919/should-package-names -是单数还是复数 (2认同)

Buv*_*inJ 12

官方约定是对文件名使用全部小写(正如其他人已经说明的那样)。然而,原因并没有被提及......

由于 Python 跨平台工作(并且以这种方式使用它很常见),但是文件系统在大小写的使用方面有所不同,因此最好消除替代情况。例如,在 Linux 中,可以将 MyClass.py 和 myclass.py 放在同一目录中。在 Windows 中并非如此!

在相关说明中,如果您在 git 存储库中有 MyClass.py 和 myclass.py,或者甚至只是更改同一文件的大小写,当您从 Linux 和 Windows 推/拉时,git 可能会表现得很时髦。

而且,虽然几乎没有主题,但同样,SQL 也有这些相同的问题,其中不同的标准和配置可能允许也可能不允许表名使用大写。

就我个人而言,即使在文件名上阅读 TitleCasing / camelCasing 也更令人愉快,但是当你做任何可以跨平台工作的事情时,最好不要这样做。


Jac*_*ack 6

我的问题是,将包含类的文件也使用驼峰命名是否也是正常的约定,特别是如果文件只包含类

简短的回答:没有。

更长的答案:应根据需要全部使用小写和下划线。

来自PEP8“包和模块名称”

模块应该有简短的全小写名称。如果可以提高可读性,可以在模块名称中使用下划线。Python 包也应该有简短的、全小写的名称,但不鼓励使用下划线。

如果您不清楚模块是什么:

模块是包含 Python 定义和语句的文件。文件名是后缀 .py 的模块名称。


and*_*nik 6

首先,如上所述,类名应该是大写字母,例如:

class SampleClass:
   ...
Run Code Online (Sandbox Code Playgroud)

注意:文件(模块)和类的名称相同会​​造成混乱。

示例 1:假设您有以下模块结构:

src/
   __init__.py
   SampleClass.py
main.py
Run Code Online (Sandbox Code Playgroud)

你的SampleClass.py是:

src/
   __init__.py
   SampleClass.py
main.py
Run Code Online (Sandbox Code Playgroud)

你的main.py是:

class SampleClass:
   ...
Run Code Online (Sandbox Code Playgroud)

这段代码可以工作吗?不,因为你应该做from src.SampleClass import SampleClassinstance = SampleClass.SampleClass()。尴尬的代码,不是吗?

您还可以通过添加以下内容来修复它__init__.py

from src import SampleClass

instance = SampleClass()
Run Code Online (Sandbox Code Playgroud)

这就引出了示例 2。

示例 2:假设您开发一个模块:

src/
   __init__.py
   BaseClass.py
   ConcreteClass.py
main.py
Run Code Online (Sandbox Code Playgroud)

BaseClass.py内容:

from .SampleClass import SampleClass
Run Code Online (Sandbox Code Playgroud)

ConcreteClass.py内容:

src/
   __init__.py
   BaseClass.py
   ConcreteClass.py
main.py
Run Code Online (Sandbox Code Playgroud)

还有你的__init__.py内容:

class BaseClass:
    ...
Run Code Online (Sandbox Code Playgroud)

内容main.py是:

from src import BaseClass

class ConcreteClass(BaseClass):
    ...
Run Code Online (Sandbox Code Playgroud)

代码失败并出现错误:

from .ConcreteClass import ConcreteClass
from .BaseClass import BaseClass
Run Code Online (Sandbox Code Playgroud)

我花了一段时间才理解该错误以及为什么我无法从该类继承,因为在前面的示例中,当我将导出添加到文件时__init__.py一切正常。如果您使用蛇形文件名,它不能解决问题,但错误更容易理解:

from src import ConcreteClass

instance = ConcreteClass()
Run Code Online (Sandbox Code Playgroud)

要修复代码,您需要将导入修复ConcreteClass.py为:from .BaseClass import BaseClass

最后一个警告,如果在原始代码中您将切换位置导入__init__.py,则它看起来像:

from .BaseClass import BaseClass
from .ConcreteClass import ConcreteClass
Run Code Online (Sandbox Code Playgroud)

初始代码可以工作,但您确实不希望任何人编写依赖于导入顺序的代码。如果有人更改顺序或应用isort工具来组织导入,祝你好运修复这些错误。


小智 5

类名和包含此类的文件的命名约定存在差异。这种误解可能来自像 java 这样的语言,其中每个类都有一个文件是很常见的。

在 python 中,每个模块可以有多个类(一个简单的 .py 文件)。应根据类命名约定调用此模块/文件中的类:类名称通常应使用 CapWords 约定。包含此类的文件应遵循模块命名约定:模块应具有简短的全小写名称。如果可以提高可读性,可以在模块名称中使用下划线。

=> CamelCase 应该在文件camelcase.py(或camel_case.py,如果需要)