FluentPython示例解析:使用NamedTuple实现坐标类

FluentPython示例解析:使用NamedTuple实现坐标类

example-code-2e Example code for Fluent Python, 2nd edition (O'Reilly 2022) example-code-2e 项目地址: https://gitcode.com/gh_mirrors/ex/example-code-2e

概述

在Python中处理地理坐标数据时,我们经常需要一个轻量级的数据结构来存储经纬度信息。FluentPython项目中的coordinates.py文件展示了一个优雅的解决方案:通过typing.NamedTuple创建一个Coordinate类。这个实现不仅简洁高效,还提供了良好的类型提示和字符串表示功能。

NamedTuple基础

NamedTuple是Python标准库typing模块提供的一个工厂函数,用于创建具有命名字段的元组子类。与普通元组相比,NamedTuple的主要优势包括:

  1. 字段可通过名称访问(如coord.lat),而不仅限于索引(如coord[0]
  2. 内置类型提示支持
  3. 自动生成__repr__方法
  4. 值不可变性(继承自tuple)

Coordinate类实现解析

让我们深入分析这个Coordinate类的实现:

from typing import NamedTuple

class Coordinate(NamedTuple):
    lat: float
    lon: float

    def __str__(self):
        ns = 'N' if self.lat >= 0 else 'S'
        we = 'E' if self.lon >= 0 else 'W'
        return f'{abs(self.lat):.1f}°{ns}, {abs(self.lon):.1f}°{we}'

类型注解

类定义中直接声明了两个字段及其类型:

  • lat: float 表示纬度
  • lon: float 表示经度

这种语法简洁明了,IDE和类型检查工具(如mypy)可以利用这些信息提供更好的代码分析和自动补全。

字符串表示

重写的__str__方法实现了地理坐标的标准表示形式:

  1. 纬度值取绝对值并保留1位小数
  2. 根据正负值添加N(北纬)或S(南纬)后缀
  3. 经度值同样处理,使用E(东经)或W(西经)

例如:

>>> moscow = Coordinate(55.756, 37.617)
>>> print(moscow)
55.8°N, 37.6°E

使用场景

这种Coordinate类非常适合以下场景:

  • GIS地理信息系统开发
  • 位置服务应用
  • 数据分析中的地理数据处理
  • 任何需要存储和操作经纬度数据的场合

进阶思考

  1. 不可变性:作为NamedTuple的子类,Coordinate实例是不可变的。这意味着创建后不能修改其属性值,这有助于避免意外的数据修改。

  2. 内存效率:NamedTuple比普通类更节省内存,因为它基于元组实现。

  3. 扩展功能:可以轻松添加其他实用方法,如计算两点间距离、格式转换等。

  4. 与dataclass对比:Python 3.7+的dataclass是另一种选择,但NamedTuple更轻量且自带不可变性。

总结

FluentPython中的这个示例展示了如何利用Python的类型系统和NamedTuple创建简洁而强大的数据结构。通过不到10行代码,我们实现了一个类型安全、内存高效且具有良好显示效果的坐标类。这种模式可以广泛应用于各种需要轻量级数据结构的场景。

example-code-2e Example code for Fluent Python, 2nd edition (O'Reilly 2022) example-code-2e 项目地址: https://gitcode.com/gh_mirrors/ex/example-code-2e

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

施余牧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值