【问题标题】:Python: ipaddress.AddressValueError: At least 3 parts expectedPython:ipaddress.AddressValueError:预计至少有 3 个部分
【发布时间】:2023-03-19 06:55:01
【问题描述】:

ipaddress.IPv4Network 的属性可用于检查是否保留了任何 IP 地址。

在 IPython 中:

In [52]: IPv4Address(u'169.254.255.1').is_private
Out[52]: False

但是,如果我在函数中尝试完全相同的事情:

import ipaddress
def isPrivateIp(ip):
    unicoded = unicode(ip)
    if ipaddress.IPv4Network(unicoded).is_private or ipaddress.IPv6Network(unicoded).is_private:
        return True
    else:
        return False

print isPrivateIp(r'169.254.255.1')

我明白了:

  File "isPrivateIP.py", line 13, in <module>
    print isPrivateIp(ur'169.254.255.1')
  File "isPrivateIP.py", line 7, in isPrivateIp
    if ipaddress.IPv4Network(unicoded).is_private or ipaddress.IPv6Network(unicoded).is_private:
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ipaddress.py", line 2119, in __init__
    self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ipaddress.py", line 1584, in _ip_int_from_string
    raise AddressValueError(msg)
ipaddress.AddressValueError: At least 3 parts expected in u'169.254.255.1'

为什么会这样?

注意:在python 2中,ip地址必须作为unicode对象传递给ipaddress函数,因此在字符串输入ip上调用unicode()

【问题讨论】:

  • 你的代码sn-ps不等价,可以清楚的看到异常与IPv6Address类有关。

标签: python string unicode ip-address


【解决方案1】:

ipaddress.IPv6Network() 的预期输入与 ipaddress.IPv4Network() 不同。如果你从你的代码中删除or ipaddress.IPv6Network(unicoded).is_private 它工作正常。您可以从here 阅读更多内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多