纯python基树实现
ppy-radix的Python项目详细描述
ppy基数是py基数的纯python叉,它实现了ipv4和ipv6网络前缀的存储和检索的基数树数据结构。_ py-radix:https://github.com/mjschultz/py-radix
基数树通常用于路由表查找。它有效地
存储不同长度的网络前缀,并允许快速查找包含
的网络。
(在这个fork中,删除了c实现,以简化在非性能关键情况下使用aws lambda的
。否则,此分叉跟踪上游py基数repo。更好的解决方案是为py基数构建一个
`manylinux1 wheel`\uu.)
…_ manylinux1控制盘:https://github.com/mjschultz/py-radix/issues/30
installation
----
>通过pip安装pip-install-ppy-radix
或使用标准的python-distutils咒语:::
python setup.py build
pythonsetup.py install
测试位于``tests/``目录中,可以使用
``python setup.py notests``运行。
用法
----
一个简单的示例演示了大多数功能:::
导入基数
=radix.radix()
添加节点将返回radix node对象。您可以在其"data"dict中创建任意成员来存储数据
rnode=rtree.add("10.0.0.0/8")
rnode.data["blah"]="随心所欲"
以下三个调用是相同的:
rnode=rtree.add("10.0.0.0/16")
rnode=rtree.add("10.0.0.0",16)
rnode=rtree.add(network="10.0.0.0",masklen=16)
通过socket模块
功能。在这种情况下,基数模块将假定
四字节地址是IPv4地址,十六字节地址是IPv6地址。例如:
binary_addr=inet_ntoa("172.18.22.0")
rnode=rtree.add(packed=binary_addr,masklen=23)
=socket.inet_ntoa("10.0.0.0")
rnode=rtree.search_exact(packed=addr,masklen=8)
best match search将返回包含搜索项(路由样式查找)的最长匹配前缀
(反向路由样式查找)
rnode=rtree.search_worst("10.123.45.6")
如果存在于树中)
rnodes=rtree.search\u covered("10.123.0.0/16")
radix节点有两个隐式成员:
print rnode.network->;"10.0.0.0"
print rnode.prefix->;"10.0.0/8"
print rnode.prefixlen->;8
打印rnode.family->;socket.af_inet
打印rnode.packed->;'\n\x00\x00\x00'
rnode.prefix
prefixes()方法将返回已输入的所有前缀(作为字符串列表)
prefixes=rtree.prefixes()
如果树很大。迭代时不要修改树(添加或删除节点),否则将中止迭代并收到运行时警告。允许更改节点的数据dict
。
对于rtree中的rnode:
打印rnode。prefix
license
----
ppy基数,与py基数一样,是在isc/bsd许可下授权的。基本的
基树实现是从mrtd中获取(并修改)的,并且受4个期限的bsd许可证的约束。有关详细信息,请参阅许可证文件。
contribution
----
上游作者<;mjschultz@gmail.com>;
用于安装/测试等。
基数树通常用于路由表查找。它有效地
存储不同长度的网络前缀,并允许快速查找包含
的网络。
(在这个fork中,删除了c实现,以简化在非性能关键情况下使用aws lambda的
。否则,此分叉跟踪上游py基数repo。更好的解决方案是为py基数构建一个
`manylinux1 wheel`\uu.)
…_ manylinux1控制盘:https://github.com/mjschultz/py-radix/issues/30
installation
----
>通过pip安装pip-install-ppy-radix
或使用标准的python-distutils咒语:::
python setup.py build
pythonsetup.py install
测试位于``tests/``目录中,可以使用
``python setup.py notests``运行。
用法
----
一个简单的示例演示了大多数功能:::
导入基数
=radix.radix()
添加节点将返回radix node对象。您可以在其"data"dict中创建任意成员来存储数据
rnode=rtree.add("10.0.0.0/8")
rnode.data["blah"]="随心所欲"
以下三个调用是相同的:
rnode=rtree.add("10.0.0.0/16")
rnode=rtree.add("10.0.0.0",16)
rnode=rtree.add(network="10.0.0.0",masklen=16)
通过socket模块
功能。在这种情况下,基数模块将假定
四字节地址是IPv4地址,十六字节地址是IPv6地址。例如:
binary_addr=inet_ntoa("172.18.22.0")
rnode=rtree.add(packed=binary_addr,masklen=23)
=socket.inet_ntoa("10.0.0.0")
rnode=rtree.search_exact(packed=addr,masklen=8)
best match search将返回包含搜索项(路由样式查找)的最长匹配前缀
(反向路由样式查找)
rnode=rtree.search_worst("10.123.45.6")
如果存在于树中)
rnodes=rtree.search\u covered("10.123.0.0/16")
radix节点有两个隐式成员:
print rnode.network->;"10.0.0.0"
print rnode.prefix->;"10.0.0/8"
print rnode.prefixlen->;8
打印rnode.family->;socket.af_inet
打印rnode.packed->;'\n\x00\x00\x00'
rnode.prefix
prefixes()方法将返回已输入的所有前缀(作为字符串列表)
prefixes=rtree.prefixes()
如果树很大。迭代时不要修改树(添加或删除节点),否则将中止迭代并收到运行时警告。允许更改节点的数据dict
。
对于rtree中的rnode:
打印rnode。prefix
license
----
ppy基数,与py基数一样,是在isc/bsd许可下授权的。基本的
基树实现是从mrtd中获取(并修改)的,并且受4个期限的bsd许可证的约束。有关详细信息,请参阅许可证文件。
contribution
----
上游作者<;mjschultz@gmail.com>;
用于安装/测试等。