Hyhttp://docs.hylang.org/是完全用 Python 编写的 Lisp 方言。许多用 Python 实现其他代码的类似项目通常仅尝试标记代码的普通形式作为类文件对象或字符串提供并将其解释为一系列显式的 Python 调用。与其他项目不同Hy 可以被看作一种完全在 Python运行环境中运行的的语言就像 Python 一样。用 Hy 编写的代码可以使用现有的内置模块和外部包反之亦然。用 Hy 编写的代码导入到 Python 中。为了将 Lisp 嵌入 Python 中Hy 将 Lisp 代码直接转换成 Python 抽象语法树。在 Python中导入 Hy 模块之后利用注册过的导入钩子可以实现导入互操作性interoperability。所有.hy扩展名的模块都被看作Hy模块都可以像普通Python模块那样导入。下面这个“helloworld”程序就是用这种 Lisp 方言编写的;; hyllo.hy(defn hello [] (print “hello world!”))利用下列 Python 代码可以将其导入并执行import hyimport hyllohyllo.hello()hello world!如果我们进一步钻研尝试利用内置的 dis 模块反汇编 hyllo.hello那么我们会注意到Hy 函数的字节码与它对应的纯 Python 代码的字节码没有很大差别如下所示import disdis.dis(hyllo.hello)2 0 LOAD_GLOBAL 0 (print)3 LOADCONST 1 (‘hello world!’)6 CALLFUNCTION 1 (1 positional, 0 keyword pair)9 RETURNVALUEdef hello(): print(“hello world!”)dis.dis(hello)1 0 LOADGLOBAL 0 (print)3 LOADCONST 1 (‘hello world!’)6 CALLFUNCTION 1 (1 positional, 0 keyword pair)9 POPTOP10 LOADCONST 0 (None)13 RETURN_VALUE小结本章介绍了与类有关的最佳语法实践。首先介绍了子类化内置类型和调用超类中的方法的基本内容。然后介绍 Python 中面向对象编程的高级概念。它们都是关于类属性访问的有用的语法特性即描述符和 property。它们可用于创建更整洁、更加可维护的代码。本章还介绍了槽重点强调始终应该谨慎使用它。本章的其余部分探讨了 Python 元编程的宏大主题。这一语法特性包含各种元编程模式例如装饰器和元类本节对其进行详细描述并给出现实代码的实例。元编程的另一个重要方面是动态代码生成本章仅做简要描述因为这一主题太过宏大而本书篇幅有限。但本书应该是一个很好的起点给出了该领域内容的快速总结。选择好的名称大部分标准库在构建时都要考虑可用性。例如内置类型的使用是很自然的其设计非常易于使用。在这种情况下Python 可以与你开发程序时所思考的伪代码进行比较。大部分代码都可以大声朗读出来。例如任何人都可以理解下面这个代码片段my_list []if ‘d’ not in my_list:my_list.append(‘d’)这就是编写 Python 比编写其他语言更加简单的原因之一。在编写程序时你的思路可以快速转换成代码。本章重点介绍编写易于理解和使用的代码的最佳实践包括• 使用 PEP 8 描述的命名约定。• 一组命名最佳实践。• 常用工具的简要介绍这些工具可以让你检查是否遵守风格指南。PEP 8 与命名最佳实践PEP 8 为编写 Python 代码提供了一个风格指南。除了空格缩进、每行最大长度以及其他与代码布局有关的细节等基本规则之外PEP 8 还介绍了大部分代码库所遵循的命名约定。本节给出了这一 PEP 的简要总结并进一步给出了每种元素的命名最佳实践指南。但你仍然必须阅读 PEP 8 文档。为何要遵守 PEP 8 以及何时遵守 PEP 8如果你正在创建一个打算开源的新软件包那么答案很简单始终遵守。PEP 8 实际上是大多数 Python 开源软件的标准代码风格。如果你想接受来自其他程序员的任何协作即使你对最佳代码风格指南有不同的看法那么也应该坚持遵守 PEP 8。这样做的好处是其他程序员可以更容易地直接上手你的项目。对于新人来说代码更容易阅读因为它的风格与大多数其他 Python 开源包一致。此外开始时完全遵守 PEP 8可以让你在未来省时省事。如果你想向公众发布你的代码最终其他程序员也会建议你切换到 PEP 8。关于对某一特定项目是否真有必要这么做的争吵可能会变成一场永无止境并且永远没有赢家的口水战flame war。这是令人悲伤的事实但为了不失去贡献者你最终可能还是会被迫与这种风格保持一致。而且如果整个项目的代码库处于成熟的开发状态那么对其重新调整风格restyling可能需要做大量的工作。在某些情况下重新调整风格可能需要修改几乎每行代码。虽然大多数修改可以自动化完成缩进、换行和行尾空格但这种大规模的代码检查通常会给所有基于分支的版本控制工作流程引入许多冲突。同时审查这么多修改也很困难。基于上述原因许多开源项目都有一条规则风格修改应该始终包含在单独的拉取/合并pull/merge请求或补丁中而不影响任何功能或 bug。超越 PEP 8 — 团队的风格指南尽管 PEP 8 提供了一套全面的风格指南但仍为开发者留有一些自由特别是在嵌套数据字面量与需要很长的参数列表的多行函数调用方面。有些团队可能会认为他们需要额外的风格规则最好的做法就是正式发布某种文件供所有团队成员使用。此外在某些情况下对于没有定义风格指南的一些老项目严格遵守 PEP 8 可能在经济上不可行。这样的项目仍然可以从正式发布的编码约定中受益即使这些约定中没有体现 PEP 8 的官方规则。要记住比遵守 PEP 8 更重要的是项目内的一致性。如果有正式发布的规则供每名程序员参考那么在项目内和组织内保持一致性就简单多了。命名风格Python 中使用的不同命名风格包括以下几种。• 驼峰式命名法CamelCase。• 混合式命名法mixedCase。• 大写UPPERCASE或大写加下划线UPPER_CASE_WITH_UNDERSCORES。• 前缀leading 和后缀 trailing下划线有时是双下划线doubled。小写元素和大写元素通常是一个单词有时是几个单词连在一起。使用下划线的通常是缩写短语。使用一个单词要更好一些。前缀和后缀下划线用于标记私有元素和特殊元素。这些风格被应用到以下几种情形。• 变量。• 函数和方法。• property。• 类。• 模块。• 包。变量Python 中有两种变量• 常量。• 公有和私有变量。1常量对于常量全局变量使用大写加下划线。它告诉开发人员指定的变量表示一个常数值。举个例子doctest 模块提供了一系列选项标记和指令https://docs.python.org/3.5/library/doctest.html#option-flags它们都是短小的句子清晰地定义了每个选项的用途from doctest import IGNORE_EXCEPTION_DETAILfrom doctest import REPORT_ONLY_FIRST_FAILURE这些变量名称看起相当长但清晰地描述它们也很重要。它们主要在初始化代码中使用而不在代码主体中使用所以这种冗长的名称并不会令人厌烦。有些常量的名称也是由底层技术驱动的。例如os 模块使用 C 中定义的一些常量例如 EX_XXX 系列定义了 Unix 退出代码编号。例如同样的名称代码可以在系统的 C 头文件 sysexits.h 中找到如下所示import osimport syssys.exit(os.EX_SOFTWARE)使用常量的另一个好的做法是将它们集中放在使用它们的模块顶部如果它们要用于下列操作那么就将其组合在新的变量中import doctestTEST_OPTIONS (doctest.ELLIPSIS |doctest.NORMALIZE_WHITESPACE |doctest.REPORT_ONLY_FIRST_FAILURE)