Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:ipAddressAttributeError:';str';对象没有属性_Python_Ip Address_Ipv6_Ipv4 - Fatal编程技术网

Python:ipAddressAttributeError:';str';对象没有属性

Python:ipAddressAttributeError:';str';对象没有属性,python,ip-address,ipv6,ipv4,Python,Ip Address,Ipv6,Ipv4,根据给出的建议,我正在使用检查ipaddress模块执行以下类型的检查: In [25]: IPv4Address(u'100.64.1.1') in IPv4Network(u'100.64.0.0/10') Out[25]: True 在伊皮顿很好。但当我把它变成一个函数时: import ipaddress def isPrivateIp(ip): ip4addressBlocks = [u'0.0.0.0/8', u'10.0.0.0/8', u'100.64.0.0/10',

根据给出的建议,我正在使用检查
ipaddress
模块执行以下类型的检查:

In [25]: IPv4Address(u'100.64.1.1') in IPv4Network(u'100.64.0.0/10')
Out[25]: True
在伊皮顿很好。但当我把它变成一个函数时:

import ipaddress
def isPrivateIp(ip):
    ip4addressBlocks = [u'0.0.0.0/8', u'10.0.0.0/8', u'100.64.0.0/10', u'127.0.0.0/8', u'169.254.0.0/16', u'172.16.0.0/12', u'192.0.0.0/24', u'192.0.2.0/24', u'192.88.99.0/24', 
    u'192.168.0.0/16', u'198.18.0.0/15', u'198.51.100.0/24', u'203.0.113.0/24', u'224.0.0.0/4', u'240.0.0.0/4', u'255.255.255.255/32']
    unicoded = unicode(ip)
    if any(unicoded in ipaddress.IPv4Network(address) for address in ip4addressBlocks):
        return True
    else:
        return False

print isPrivateIp(r'169.254.255.1')
我得到:

  File "isPrivateIP.py", line 14, in <module>
    print isPrivateIp(r'169.254.255.1')
  File "isPrivateIP.py", line 9, in isPrivateIp
    if any(unicoded in ipaddress.IPv4Network(address) for address in ip4addressBlocks):
  File "isPrivateIP.py", line 9, in <genexpr>
    if any(unicoded in ipaddress.IPv4Network(address) for address in ip4addressBlocks):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ipaddress.py", line 705, in __contains__
    if self._version != other._version:
AttributeError: 'str' object has no attribute '_version'
文件“isPrivateIP.py”,第14行,在
打印isPrivateIp(r'169.254.255.1')
文件“isPrivateIP.py”,第9行,在isPrivateIP中
如果有(ip4addressBlocks中地址的ipaddress.IPV4网络(地址)中的Unicode):
文件“isPrivateIP.py”,第9行,在
如果有(ip4addressBlocks中地址的ipaddress.IPV4网络(地址)中的Unicode):
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/ipaddress.py”,第705行,在__
如果是自己的话。_版本!=其他._版本:
AttributeError:'str'对象没有属性'\u version'

为什么会这样?

检查unicode字符串
ip
是否在网络中,而在使用
IPv4Address
实例之前

你的测试必须改为

if any(IPv4Address(unicoded) in ipaddress.IPv4Network(address) for address \
       in ip4addressBlocks):

@Phillip的回答是正确的,我只想进一步说明一下。我认为,从你的其他问题来看,你正在一次攻破许多编程和Python特定的想法,一些解释可能会有所帮助——或者至少证明它是密集的代码,但不是魔法,如果你想的话,还可以给你谷歌一些其他术语

对象

这是一个很大的主题,没有简单的教程介绍,所以我不打算尝试链接其中一个。但是,当您执行
IPv4Address(u'100.64.1.1')
时,不仅要测试IP地址是否为有效地址是或否,还需要大量处理IP地址的代码,将其包装在您提供的地址周围,然后返回整个内容

就像托尼·斯塔克(Tony Stark)穿上他的钢铁侠套装一样,这需要基本文本,并为您提供一个经过优化的IPv4Address对象,其中包含大量用于处理IP地址的增强功能

IPv4Network()
与此类似,它接受您的网络地址文本,并将其包装在一堆用于处理IP网络的增强功能中

遏制

当您在IPv4Network(u'100.64.0.0/10')中执行IPv4Address(u'100.64.1.1')时,额外的增强代码可以理解一个网络“位于”另一个网络的含义

在您的问题中,您的代码正在执行:
在ipaddress中进行unicoded。ipv4网络(地址)
unicoded
在这一点上仍然只是文本

“带有一些单词的句子”中的“单词”
是一种测试一个文本字符串是否在另一个文本字符串中的方法,因此您的代码正在执行一半的文本成员资格测试和另一半的IPV4网络成员资格测试。这种不匹配会导致失败和错误。IPv4Network对象无法处理

(在中的关键字
调用后台来处理此类测试)

理解力

在你的另一个问题中,你问了一个用Python做事情的更好的方法(问这个问题很好),代码是从经典的
for
loop形状(例如伪代码)开始的:

对于此单线形状:

[if address in network for network in networks]
重新设计的单行版本是一个特殊的例子,它是针对“为列表中的每个项目做一些事情,并将结果收集到另一个列表”的常见模式而设计的。e、 g

(更具体地说,没有外部的
[
]
,这是相同的东西,但现在称为a,它是一个更新的版本,内存效率更高)

任何

然后
any()
函数将列表汇总为一个结果。它根据真值True/False来考虑列表,如果列表中的任何内容为True,则返回True。从上面:

>>> results
[False, False, True, True, True, True]
>>> any(results)
True
(它使用
all()
函数测试列表中的所有内容是否正确)

因此,将所有这些结合在一起得到的代码行是:

if any(ipaddress.IPv4Address(unicoded) in ipaddress.IPv4Network(address) for address in ip4addressBlocks):
    print "it's reserved"
但这仍然是丑陋的。部分原因是它写了很多“ipaddress”,部分原因是它反复构建增强对象,部分原因是变量名“ip4addressBlocks”没有解释它们的意义,部分原因是您重复测试true/false,然后返回true/false

所以,在这里,我:

  • 只导入模块中的两个名称,这样我就可以直接使用它们,而无需写入
    ipaddress.
    任何地方
  • 在开始时构建一次保留列表IPV4网络对象
  • 构建IPv4Address对象一次
  • 运行测试并直接返回值,去掉“if-true-return-true-else-return-false”
  • 我不知道你为什么把unicode和原始字符串放在所有地方,但它似乎没有必要,所以我把它删除了
e、 g:


@Tessellinghecker这本书写得很好,解释得很透彻,谢谢。
>>> results
[False, False, True, True, True, True]
>>> any(results)
True
if any(ipaddress.IPv4Address(unicoded) in ipaddress.IPv4Network(address) for address in ip4addressBlocks):
    print "it's reserved"
from ipaddress import IPv4Address, IPv4Network

reserved_networks = [IPv4Network(x) for x in [
    '0.0.0.0/8',      '10.0.0.0/8',     '100.64.0.0/10', '127.0.0.0/8', 
    '169.254.0.0/16', '172.16.0.0/12',  '192.0.0.0/24',  '192.0.2.0/24',      
    '192.88.99.0/24', '192.168.0.0/16', '198.18.0.0/15', '198.51.100.0/24',
    '203.0.113.0/24', '224.0.0.0/4',    '240.0.0.0/4',   '255.255.255.255/32'
    ]]

def isPrivateIp(ip):
    # True if ip is in a reserved range, otherwise False
    ip = IPv4Address(ip)
    return any((ip in net) for net in reserved_networks)

print isPrivateIp('179.254.255.1')