当前位置: 首页 > news >正文

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)

http://www.jsqmd.com/news/991753/

相关文章:

  • CANN架构解析|GE图编译引擎核心原理与优化策略:深度剖析图编译技术在异构计算中的应用与实践
  • 【徕卡全站仪GeoCOM开发】实战手记#02:模块解析与自动化测量流程构建
  • 从栈到递归:深入解析前缀表达式的三种求值策略
  • 华硕笔记本终极控制方案:G-Helper完整指南与优化教程
  • 惠州防水补漏 TOP5 排名及调研解析:2026 本地修缮企业盘点,阳台飘窗漏水、厨卫渗水、外墙防水以及瓷砖破损维修全覆盖 - 泛家庭维修
  • 如何在Windows上获得完美透明任务栏?TranslucentTB让你轻松实现
  • 告别“大泥球”:我在 Spring Boot 单体架构中实践的模块化隔离
  • 从零打造复古像素字体:我的8x16 ASCII字模设计与优化心得
  • 钢结构相关标准目录
  • 大模型的幻觉是什么?为什么会产生幻觉
  • 无人机+数字孪生:光伏电站运维迈入智能化新阶段
  • 抖音无水印视频下载器:三步轻松保存高清内容
  • 跨平台MSG邮件查看器:3步免费解决Outlook格式困扰的终极指南
  • 北京黄金回收哪家价格高?2026 年 6 月最新甄选 TOP5 店铺推荐(服务体验篇) - 奢侈品回收
  • 2026最新Java面试1000题(高频·带答案),覆盖大厂考点,建议直接收藏!
  • GHelper深度解析:5个核心功能助你全面掌控华硕笔记本性能
  • OpenBlock Desktop:5分钟快速上手的硬件图形化编程工具
  • Linux——管理存储堆栈
  • OpenClaw 微信绑定全流程,手机端轻松操控电脑
  • 番茄小说下载器:你的个人数字图书馆构建利器
  • UI自动化测试|元素操作浏览器操作实践
  • 英雄联盟客户端增强工具LeagueAkari:基于LCU API的现代化游戏辅助框架
  • FPGA单端口RAM IP核实战:从配置到在线调试的完整流程
  • Anthropic Claude Fable 5 Mythos 5: 双轨发布背后的技术革命与安全博弈
  • 如何用Charticulator零代码设计专业图表:微软开源的数据可视化神器
  • 游戏存档编辑神器:uesave让你轻松掌控游戏进度
  • 用FPGA玩转直流电机:从PWM原理到Quartus II工程实战(附Verilog源码)
  • 北京联合大学考研辅导班精选推荐:实力品牌解析与选班指南 - 推荐优选师
  • RabbitMQ中如何保证消息的可靠性传输
  • eNSP实战:USG6000V防火墙NAT64配置与双栈网络互通详解