0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonでIPv4作成時に raise ValueError('%s has host bits set' % self)が発生する

Posted at

はじめに

業務中に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になるはずだった。)
image.png

使い方

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'>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?