你能解释Python基础库中函数的奇怪和不一致的命名吗?

时间:2017-09-01 15:19:54

标签: python naming-conventions standards

当我开始学习Python的时候,我开始喜欢它,因为它比PHP有更多的结构,它有很多功能不能很好地流动,但我注意到奇怪的不一致,没有明显的推理在Python中好。

例如,在PHP中,some functions for arrays以名称开头的“数组”,有些不用,有些使用下划线,有些则将名称的部分缩短为单个字符,等等并且它们通常需要将数组作为参数而不是数组对象的方法。

在Python中,有很多单字函数名称,但是当涉及多个单词时,我看到了不一致。
例如,使用像logging.StreamHandler()这样的camelcase记录模块方法,在sys.base_prefix()这样的sys中强调,只是小写,没有像os.expandvars()这样的分隔符。
好像这还不够,有像os.path.splitext()这样的函数名称最终导致我发布这个。

为什么它们不是所有类型的惯例?

logging.StreamHandler() # capitalize in case classes
sys.basePrefix()
os.expandVars()
os.path.splitText()

甚至是这样:

logging.stream_handler()
sys.base_prefix()
os.expand_vars()
os.path.split_text() # the original is actually "spli + text" in one word!

是否有任何流行的编程语言严格遵守以下示例中的惯例?

some_value        # variable lower case separated by underscores (which allows them to appear descriptive)
someFunction()    # functions and methods camel case, first letter lower case (differentiates from variables while still readable and allows simple names like get() and send())
SomeObject()      # classes always start with capital letters and are camelcase (makes them stand out and above but appear closer to functions)
IMPORTANT_VALUE   # constants always upper case, separated by underscores (easily tell apart from anything else, while being the reverse case from normal variables)

那么为什么会发生这种情况并且像我的例子这样的事情在现实中发生了很大的变化?

2 个答案:

答案 0 :(得分:0)

出现这些不一致的部分原因是因为 Python 开发人员认为单个模块内的一致性比与标准库其余部分的一致性更重要。

至于为什么标准库中的模块具有不同的命名约定,其中许多是由于多种原因而产生的。例如,os 模块,C 标准和系统/POSIX 库中的大多数函数都直接封装了同名函数;为了减少 C 和 Python 开发人员之间的摩擦并利用开发人员现有的 POSIX 知识,C 名称只是按原样用于该模块。 os 模块中有一些函数与 C/POSIX 函数没有对应关系,但为了避免 os 模块内部的不一致,它们也继承了 C 命名约定。

如果您想要标准库的 Pythonic 版本,os 中的许多函数都有更高级别的包装器,例如 subprocess 模块和 pathlib。这些模块遵循 PEP8 命名约定。

PEP8 规定类用 CamelCase 命名,变量、函数和属性用 snake_case 命名,这解释了 logging.StreamHandlersys.base_prefix 之间的区别。

还有像 XML/HTML DOM 这样的库,它指定了更符合 JavaScript 命名约定的函数名称(XML 和 HTML DOM API 是由 web 标准人员设计的,遵循 JavaScript 的传统),或者 unittest是基于 Java 的 xUnit 设计的。 Python 决定只采用那些现有的命名约定,以利用已经熟悉现有名称的人的熟悉程度,因为 API 只是按原样复制。

<块引用>

然后决定在这里和那里省略英文单词的字母

大多数省略字母的函数名通常来自古老的 C 库,当文本编辑器不那么先进并且人们想要保存字母以尽量减少输入长变量名或当有限制字符限制时,这些函数名被重新命名你可以给事物命名多久。 Python 和 PHP 为这些函数的低级包装器继承了许多这些名称。

Python 经常被用作胶水语言,这意味着它经常用于将应用程序与其他语言编写的库组合在一起,这些库具有自己现有的命名约定。仅仅为了符合 Python 的命名约定而重命名这些已建立的接口只会让熟悉已建立的 API 的人无缘无故地感到困惑,因为在阅读文档时与已建立的 API 的一致性更为重要,而与其他标准库的一致性则更为重要。几乎只是为了美观。

答案 1 :(得分:-2)

这是一个很好的问题。我相信这是因为人们可以为它们命名,所以一些效率可以胜过可读性,而其他人则相反。