NamedTuple技巧用法

PS: 第一眼看到这个代码的时候,就联想到了go中的构造函数,虽然知道go中的构造函数其实就类比于python中的构造函数__init__,但是不得不说,这个太像了

在日常编码中,我们经常需要写一些返回多个值的函数。举个例子,下面这个地理位置相关的函数
用python的标准做法返回了多个结果:

def latlon_to_address(lat, lon):
  return country, province, city

country, province, city = latlon_to_address(lat, lon)

但是有一天,产品需求变了,除了国家、省份和城市,调用方还需要用到一个新的位置信息:“城区”(district)。
因此latlon_to_address()函数得增加一个新的返回值,返回4个结果:country、province、city、district

修改函数的返回结果后,为了保证兼容,你还需要找到所有调用latlon_to_address()的地方,补上多出来的district变量,
否则代码就会报错
但以上这些为了保证兼容性的批量修改,其实原本可以避免
对于这种未来可能会变动的多返回值函数来说,如果一开始就使用NamedTuple类型对返回结果进行建模,上面的改动会变得简单许多

from typing import NamedTuple

class Address(NamedTuple):
  country: str
  province: str
  city: str

def lation_to_address(lat, lon):
  return Address(
    country=country,
    province=province,
    city=city,
  )

addr = latlon_to_address(lat, lon)
# 后续可以通过属性名来使用addr
# addr.country / addr.province
posted @ 2022-09-06 13:08  我在路上回头看  阅读(44)  评论(0编辑  收藏  举报