netaddr升级至1.2.1后BaseIP类is_private方法替代方案咨询
替代netaddr旧版本
is_private方法的实现方案 核心逻辑对齐
netaddr 0.10.1版本的BaseIP.is_private()会检查IP是否属于私有地址、链路本地地址、环回地址、站点本地地址等范围,新版本可以通过组合官方提供的预定义网络集合完整复现这一逻辑。
具体实现
1. 导入所需预定义集合
from netaddr import ( IPV4_PRIVATE_USE, IPV4_LINK_LOCAL, IPV4_LOOPBACK, IPV4_SITE_LOCAL, IPV6_PRIVATE_USE, IPV6_LINK_LOCAL, IPV6_LOOPBACK, IPV6_SITE_LOCAL )
2. 定义兼容函数
写一个轻量工具函数,同时兼容IPv4和IPv6:
# 提前合并网络集合,避免重复计算 _IPV4_PRIVATE_FULL = IPV4_PRIVATE_USE | IPV4_LINK_LOCAL | IPV4_LOOPBACK | IPV4_SITE_LOCAL _IPV6_PRIVATE_FULL = IPV6_PRIVATE_USE | IPV6_LINK_LOCAL | IPV6_LOOPBACK | IPV6_SITE_LOCAL def is_private(ip): """复现netaddr 0.10.1版本is_private方法的完整逻辑""" if ip.version == 4: return ip in _IPV4_PRIVATE_FULL elif ip.version == 6: return ip in _IPV6_PRIVATE_FULL return False
3. 替换原有调用
把旧代码中的:
if mynetwork.is_private(): # DO SOMETHING
替换为:
if is_private(mynetwork): # DO SOMETHING
覆盖范围说明
这个实现完全覆盖旧版本is_private()以及IPV4_PRIVATEISH/IPV6_PRIVATEISH包含的所有场景:
- 私有地址段(对应
*_PRIVATE_USE) - 链路本地地址(对应
*_LINK_LOCAL) - 环回地址(对应
*_LOOPBACK) - 站点本地地址(对应
*_SITE_LOCAL)
内容的提问来源于stack exchange,提问作者NPatel
相关产品推荐
相关产品推荐

