はじめに
業務中にipaddressモジュールのIPv4Addressまわりで解決に時間がかかったので忘備録として記録します。
内容
オクテットを連結させてIPv4を作成する処理で下記エラーが発生していた。
File "/usr/lib/python3.11/ipaddresst.py", line 1507, in __init__
raise ValueError('%s has host bits set' % self)
ValueError: 10.128.2.17/30 has host bits set
原因
ipaddress --- IPv4/IPv6 操作ライブラリに以下の記載がある。
ipaddress.ip_networkは正しい IPv4, IPv6 アドレスを表現していない場合や、ネットワークの host bit がセットされていた場合は ValueError を発生させます。
今回の場合、ipaddress.ip_networkの引数にhost bitが指定されていたため、ValueErrorが発生していた。
ipaddress.ip_network(address, strict=True)
引数 | 説明 |
---|---|
address | IPネットワークを示す文字列または整数(IPv4 または IPv6) |
strict=True | ネットワークアドレスでないとエラーを発生させる(デフォルト True) |
今回の解決方法
取得元の値がそもそも誤っていた。
本来ネットワークアドレスを指定するはず箇所に、host bitが渡されていたため、対向システムの問題であった。
(本来であれば、10.128.2.16/30になるはずだった。)
使い方
1. 基本的な利用方法
ip_network() は、文字列で指定された CIDR表記のIPアドレス を IPv4Network または IPv6Network のオブジェクト に変換する。
import ipaddress
network = ipaddress.IPv4Network("10.128.2.16/30")
print(network) # 10.128.2.16/30
print(type(network)) # <class 'ipaddress.IPv4Network'>
2. strict=Fase
の場合
デフォルトでは strict=True
のため、ネットワークアドレス以外を指定するとエラーになる。
しかし、エラーを回避したい場合strict=False
を設定すると、host bitが設定されていたとしても、ネットワークアドレスに自動的に補正される。
import ipaddress
network = ipaddress.IPv4Network("10.128.2.17/30", strict=False)
print(network) # 10.128.2.16/30
print(type(network)) # <class 'ipaddress.IPv4Network'>