原文發表在個人博客主頁,轉載請註明出處python
這個庫是在閱讀別人的源碼的時候看到的,以爲十分好用,然而在網上找到的相關資料甚少,因此閱讀了源碼來作一個簡單的用法總結。在網絡的路由表中,常常會經過掩碼來表示流表的匹配域,在python中有的時候爲了方便的模擬流表的匹配過程,能夠經過一個整數區間來表示諸如IP等的匹配範圍,而本文介紹的庫在區間處理上是十分的強大與方便。網絡
不管是在Linux系統仍是Windows系統上,咱們均可以方便的安裝pip或者easy_install庫來方便的安裝大多數python庫,interval也不例外。
在這個庫中提供了兩個主要的類,分別是Interval和IntervalSet兩個類。
Interval類描述了一個連續的範圍區間,這個區間能夠是閉、開、半閉半開、無窮的,他的區間值不必定是數字,能夠包含任何的數據類型,好比字符串,時間等等,同時他和python的各類操做(<, <=, ==, >=, >等)也是兼容的。IntervalSet包含了一個或多個互不相交的Interval集合。下面的這幾個例子是源碼中的。less
>>> volume1 = Interval.between("A", "Foe") >>> volume2 = Interval.between("Fog", "McAfee") >>> volume3 = Interval.between("McDonalds", "Space") >>> volume4 = Interval.between("Spade", "Zygote") >>> encyclopedia = IntervalSet([volume1, volume2, volume3, volume4]) >>> mySet = IntervalSet([volume1, volume3, volume4]) >>> "Meteor" in encyclopedia True >>> "Goose" in encyclopedia True >>> "Goose" in mySet False >>> volume2 in (encyclopedia ^ mySet) True
前面的三個例子比較容易理解,最後一個例子中,encyclopedia的區別就是mySet多了一個volume2,而異或就是將兩個集合中相同的元素去掉,不一樣的元素保留,因此最後只剩下了volume2。
除了字符串,利用interval還能夠很方便的處理時間,下面的例子一樣來自於源碼。函數
>>> officeHours = IntervalSet.between("08:00", "17:00") >>> myLunch = IntervalSet.between("11:30", "12:30") >>> myHours = IntervalSet.between("08:30", "19:30") - myLunch >>> myHours.issubset(officeHours) False >>> "12:00" in myHours False >>> "15:30" in myHours True >>> inOffice = officeHours & myHours >>> print inOffice ['08:30'..'11:30'),('12:30'..'17:00'] >>> overtime = myHours - officeHours >>> print overtime ('17:00'..'19:30']
在前言中說道interval庫能夠處理IP地址,簡單的列舉應用以下:code
# coding r1 = IntervalSet([Interval(1, 1000), Interval(1100, 1200)]) r2 = IntervalSet([Interval(30, 50), Interval(60, 200), Interval(1150, 1300)]) r3 = IntervalSet([Interval(1000, 3000)]) r4 = IntervalSet([Interval(1000, 3000)]) r5 = IntervalSet([Interval(30000, 12000)]) print (r3 - r4), (r4 - r3), r3 & r4 print len(IntervalSet.empty()) if r3 & r4 == r4: print 'yes' print r3 & r4 if (r3 - r4).empty(): print "true" print (r3 - r4).empty() # output <Empty> <Empty> [1000..3000] 0 yes [1000..3000] <Empty>
是一篇總結文章,並無什麼深度,只是爲了避免再重複造輪子,在必要的時候一個庫能夠極大的提升效率。對象