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和原始字符串放在所有地方,但它似乎没有必要,所以我把它删除了
@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')