Python 高手编程系列四百三十五 :Hy

Hy(http://docs.hylang.org/)是完全用 Python 编写的 Lisp 方言。许多用 Python 实现其
他代码的类似项目,通常仅尝试标记代码的普通形式(作为类文件对象或字符串提供),并
将其解释为一系列显式的 Python 调用。与其他项目不同,Hy 可以被看作一种完全在 Python
运行环境中运行的的语言,就像 Python 一样。用 Hy 编写的代码可以使用现有的内置模块
和外部包,反之亦然。用 Hy 编写的代码导入到 Python 中。
为了将 Lisp 嵌入 Python 中,Hy 将 Lisp 代码直接转换成 Python 抽象语法树。在 Python
中导入 Hy 模块之后,利用注册过的导入钩子可以实现导入互操作性(interoperability)。所
有.hy扩展名的模块都被看作Hy模块,都可以像普通Python模块那样导入。下面这个“hello
world”程序就是用这种 Lisp 方言编写的:
;; hyllo.hy
(defn hello [] (print “hello world!”))
利用下列 Python 代码可以将其导入并执行:

import hy
import hyllo
hyllo.hello()
hello world!
如果我们进一步钻研,尝试利用内置的 dis 模块反汇编 hyllo.hello,那么我们会
注意到,Hy 函数的字节码与它对应的纯 Python 代码的字节码没有很大差别,如下所示:
import dis
dis.dis(hyllo.hello)
2 0 LOAD_ GLOBAL 0 (print)
3 LOAD
CONST 1 (‘hello world!’)
6 CALL
FUNCTION 1 (1 positional, 0 keyword pair)
9 RETURN
VALUE
def hello(): print(“hello world!”)
dis.dis(hello)
1 0 LOAD
GLOBAL 0 (print)
3 LOAD
CONST 1 (‘hello world!’)
6 CALL
FUNCTION 1 (1 positional, 0 keyword pair)
9 POP
TOP
10 LOAD
CONST 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_DETAIL
from doctest import REPORT_ONLY_FIRST_FAILURE
这些变量名称看起相当长,但清晰地描述它们也很重要。它们主要在初始化代码中使
用,而不在代码主体中使用,所以这种冗长的名称并不会令人厌烦。
有些常量的名称也是由底层技术驱动的。例如,os 模块使用 C 中定义的一些常量,例
如 EX_XXX 系列定义了 Unix 退出代码编号。例如,同样的名称代码可以在系统的 C 头文
件 sysexits.h 中找到,如下所示:
import os
import sys
sys.exit(os.EX_SOFTWARE)
使用常量的另一个好的做法是,将它们集中放在使用它们的模块顶部,如果它们要用
于下列操作,那么就将其组合在新的变量中:
import doctest
TEST_OPTIONS = (doctest.ELLIPSIS |
doctest.NORMALIZE_WHITESPACE |
doctest.REPORT_ONLY_FIRST_FAILURE)

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值