<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
<title>CMake.git - CMake is a cross-platform, open-source build system generator.</title>
<meta name='generator' content='cgit v0.12'/>
<meta name='robots' content='index, nofollow'/>
<link rel='stylesheet' type='text/css' href='/cgit-data/cgit-techsat.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='http://service.techsat.com/oss-git/CMake.git/atom/Modules/Qt4Macros.cmake?h=v3.19.4' type='application/atom+xml'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/oss-git/'><img src='/cgit-data/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/oss-git/'>index</a> : <a title='CMake.git' href='/oss-git/CMake.git/'>CMake.git</a></td><td class='form'><form method='get' action=''>
<input type='hidden' name='id' value='5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'/><select name='h' onchange='this.form.submit();'>
<option value='master'>master</option>
<option value='release'>release</option>
</select> <input type='submit' name='' value='switch'/></form></td></tr>
<tr><td class='sub'>CMake is a cross-platform, open-source build system generator.</td><td class='sub right'></td></tr></table>
<table class='tabs'><tr><td>
<a href='/oss-git/CMake.git/?h=v3.19.4'>summary</a><a href='/oss-git/CMake.git/refs/?h=v3.19.4&amp;id=5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'>refs</a><a href='/oss-git/CMake.git/log/Modules/Qt4Macros.cmake?h=v3.19.4'>log</a><a class='active' href='/oss-git/CMake.git/tree/Modules/Qt4Macros.cmake?h=v3.19.4&amp;id=5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'>tree</a><a href='/oss-git/CMake.git/commit/Modules/Qt4Macros.cmake?h=v3.19.4&amp;id=5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'>commit</a><a href='/oss-git/CMake.git/diff/Modules/Qt4Macros.cmake?h=v3.19.4&amp;id=5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'>diff</a><a href='/oss-git/CMake.git/stats/Modules/Qt4Macros.cmake?h=v3.19.4'>stats</a></td><td class='form'><form class='right' method='get' action='/oss-git/CMake.git/log/Modules/Qt4Macros.cmake'>
<input type='hidden' name='h' value='v3.19.4'/><input type='hidden' name='id' value='5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='text' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/oss-git/CMake.git/tree/?h=v3.19.4&amp;id=5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'>root</a>/<a href='/oss-git/CMake.git/tree/Modules?h=v3.19.4&amp;id=5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'>Modules</a>/<a href='/oss-git/CMake.git/tree/Modules/Qt4Macros.cmake?h=v3.19.4&amp;id=5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'>Qt4Macros.cmake</a></div><div class='content'>blob: cb6ae4398dc43286f9477f89fae03939f97efd36 (<a href='/oss-git/CMake.git/plain/Modules/Qt4Macros.cmake?h=v3.19.4&amp;id=5f882f6ce518a9f90600ae5c73f633ca5c15a7e5'>plain</a>)
<table summary='blob content' class='blob'>
<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a>
<a id='n2' href='#n2'>2</a>
<a id='n3' href='#n3'>3</a>
<a id='n4' href='#n4'>4</a>
<a id='n5' href='#n5'>5</a>
<a id='n6' href='#n6'>6</a>
<a id='n7' href='#n7'>7</a>
<a id='n8' href='#n8'>8</a>
<a id='n9' href='#n9'>9</a>
<a id='n10' href='#n10'>10</a>
<a id='n11' href='#n11'>11</a>
<a id='n12' href='#n12'>12</a>
<a id='n13' href='#n13'>13</a>
<a id='n14' href='#n14'>14</a>
<a id='n15' href='#n15'>15</a>
<a id='n16' href='#n16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
<a id='n43' href='#n43'>43</a>
<a id='n44' href='#n44'>44</a>
<a id='n45' href='#n45'>45</a>
<a id='n46' href='#n46'>46</a>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
<a id='n78' href='#n78'>78</a>
<a id='n79' href='#n79'>79</a>
<a id='n80' href='#n80'>80</a>
<a id='n81' href='#n81'>81</a>
<a id='n82' href='#n82'>82</a>
<a id='n83' href='#n83'>83</a>
<a id='n84' href='#n84'>84</a>
<a id='n85' href='#n85'>85</a>
<a id='n86' href='#n86'>86</a>
<a id='n87' href='#n87'>87</a>
<a id='n88' href='#n88'>88</a>
<a id='n89' href='#n89'>89</a>
<a id='n90' href='#n90'>90</a>
<a id='n91' href='#n91'>91</a>
<a id='n92' href='#n92'>92</a>
<a id='n93' href='#n93'>93</a>
<a id='n94' href='#n94'>94</a>
<a id='n95' href='#n95'>95</a>
<a id='n96' href='#n96'>96</a>
<a id='n97' href='#n97'>97</a>
<a id='n98' href='#n98'>98</a>
<a id='n99' href='#n99'>99</a>
<a id='n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
<a id='n113' href='#n113'>113</a>
<a id='n114' href='#n114'>114</a>
<a id='n115' href='#n115'>115</a>
<a id='n116' href='#n116'>116</a>
<a id='n117' href='#n117'>117</a>
<a id='n118' href='#n118'>118</a>
<a id='n119' href='#n119'>119</a>
<a id='n120' href='#n120'>120</a>
<a id='n121' href='#n121'>121</a>
<a id='n122' href='#n122'>122</a>
<a id='n123' href='#n123'>123</a>
<a id='n124' href='#n124'>124</a>
<a id='n125' href='#n125'>125</a>
<a id='n126' href='#n126'>126</a>
<a id='n127' href='#n127'>127</a>
<a id='n128' href='#n128'>128</a>
<a id='n129' href='#n129'>129</a>
<a id='n130' href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
<a id='n141' href='#n141'>141</a>
<a id='n142' href='#n142'>142</a>
<a id='n143' href='#n143'>143</a>
<a id='n144' href='#n144'>144</a>
<a id='n145' href='#n145'>145</a>
<a id='n146' href='#n146'>146</a>
<a id='n147' href='#n147'>147</a>
<a id='n148' href='#n148'>148</a>
<a id='n149' href='#n149'>149</a>
<a id='n150' href='#n150'>150</a>
<a id='n151' href='#n151'>151</a>
<a id='n152' href='#n152'>152</a>
<a id='n153' href='#n153'>153</a>
<a id='n154' href='#n154'>154</a>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
<a id='n425' href='#n425'>425</a>
<a id='n426' href='#n426'>426</a>
<a id='n427' href='#n427'>427</a>
<a id='n428' href='#n428'>428</a>
<a id='n429' href='#n429'>429</a>
<a id='n430' href='#n430'>430</a>
<a id='n431' href='#n431'>431</a>
<a id='n432' href='#n432'>432</a>
<a id='n433' href='#n433'>433</a>
<a id='n434' href='#n434'>434</a>
<a id='n435' href='#n435'>435</a>
<a id='n436' href='#n436'>436</a>
<a id='n437' href='#n437'>437</a>
<a id='n438' href='#n438'>438</a>
<a id='n439' href='#n439'>439</a>
<a id='n440' href='#n440'>440</a>
<a id='n441' href='#n441'>441</a>
<a id='n442' href='#n442'>442</a>
<a id='n443' href='#n443'>443</a>
<a id='n444' href='#n444'>444</a>
<a id='n445' href='#n445'>445</a>
<a id='n446' href='#n446'>446</a>
<a id='n447' href='#n447'>447</a>
<a id='n448' href='#n448'>448</a>
<a id='n449' href='#n449'>449</a>
<a id='n450' href='#n450'>450</a>
<a id='n451' href='#n451'>451</a>
<a id='n452' href='#n452'>452</a>
<a id='n453' href='#n453'>453</a>
<a id='n454' href='#n454'>454</a>
<a id='n455' href='#n455'>455</a>
<a id='n456' href='#n456'>456</a>
<a id='n457' href='#n457'>457</a>
<a id='n458' href='#n458'>458</a>
<a id='n459' href='#n459'>459</a>
<a id='n460' href='#n460'>460</a>
<a id='n461' href='#n461'>461</a>
<a id='n462' href='#n462'>462</a>
<a id='n463' href='#n463'>463</a>
<a id='n464' href='#n464'>464</a>
<a id='n465' href='#n465'>465</a>
<a id='n466' href='#n466'>466</a>
<a id='n467' href='#n467'>467</a>
<a id='n468' href='#n468'>468</a>
<a id='n469' href='#n469'>469</a>
<a id='n470' href='#n470'>470</a>
<a id='n471' href='#n471'>471</a>
<a id='n472' href='#n472'>472</a>
<a id='n473' href='#n473'>473</a>
<a id='n474' href='#n474'>474</a>
<a id='n475' href='#n475'>475</a>
<a id='n476' href='#n476'>476</a>
<a id='n477' href='#n477'>477</a>
<a id='n478' href='#n478'>478</a>
<a id='n479' href='#n479'>479</a>
<a id='n480' href='#n480'>480</a>
<a id='n481' href='#n481'>481</a>
<a id='n482' href='#n482'>482</a>
<a id='n483' href='#n483'>483</a>
<a id='n484' href='#n484'>484</a>
<a id='n485' href='#n485'>485</a>
<a id='n486' href='#n486'>486</a>
<a id='n487' href='#n487'>487</a>
<a id='n488' href='#n488'>488</a>
<a id='n489' href='#n489'>489</a>
<a id='n490' href='#n490'>490</a>
<a id='n491' href='#n491'>491</a>
<a id='n492' href='#n492'>492</a>
<a id='n493' href='#n493'>493</a>
<a id='n494' href='#n494'>494</a>
<a id='n495' href='#n495'>495</a>
<a id='n496' href='#n496'>496</a>
<a id='n497' href='#n497'>497</a>
<a id='n498' href='#n498'>498</a>
<a id='n499' href='#n499'>499</a>
<a id='n500' href='#n500'>500</a>
<a id='n501' href='#n501'>501</a>
<a id='n502' href='#n502'>502</a>
<a id='n503' href='#n503'>503</a>
<a id='n504' href='#n504'>504</a>
<a id='n505' href='#n505'>505</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
</pre></td>
<td class='lines'><pre><code>05</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
<a id='n517' href='#n517'>517</a>
<a id='n518' href='#n518'>518</a>
<a id='n519' href='#n519'>519</a>
<a id='n520' href='#n520'>520</a>
<a id='n521' href='#n521'>521</a>
<a id='n522' href='#n522'>522</a>
<a id='n523' href='#n523'>523</a>
<a id='n524' href='#n524'>524</a>
<a id='n525' href='#n525'>525</a>
<a id='n526' href='#n526'>526</a>
<a id='n527' href='#n527'>527</a>
<a id='n528' href='#n528'>528</a>
<a id='n529' href='#n529'>529</a>
<a id='n530' href='#n530'>530</a>
<a id='n531' href='#n531'>531</a>
<a id='n532' href='#n532'>532</a>
<a id='n533' href='#n533'>533</a>
<a id='n534' href='#n534'>534</a>
<a id='n535' href='#n535'>535</a>
<a id='n536' href='#n536'>536</a>
<a id='n537' href='#n537'>537</a>
<a id='n538' href='#n538'>538</a>
<a id='n539' href='#n539'>539</a>
<a id='n540' href='#n540'>540</a>
<a id='n541' href='#n541'>541</a>
<a id='n542' href='#n542'>542</a>
<a id='n543' href='#n543'>543</a>
<a id='n544' href='#n544'>544</a>
<a id='n545' href='#n545'>545</a>
<a id='n546' href='#n546'>546</a>
<a id='n547' href='#n547'>547</a>
<a id='n548' href='#n548'>548</a>
<a id='n549' href='#n549'>549</a>
<a id='n550' href='#n550'>550</a>
<a id='n551' href='#n551'>551</a>
<a id='n552' href='#n552'>552</a>
<a id='n553' href='#n553'>553</a>
<a id='n554' href='#n554'>554</a>
<a id='n555' href='#n555'>555</a>
<a id='n556' href='#n556'>556</a>
<a id='n557' href='#n557'>557</a>
<a id='n558' href='#n558'>558</a>
<a id='n559' href='#n559'>559</a>
<a id='n560' href='#n560'>560</a>
<a id='n561' href='#n561'>561</a>
<a id='n562' href='#n562'>562</a>
<a id='n563' href='#n563'>563</a>
<a id='n564' href='#n564'>564</a>
<a id='n565' href='#n565'>565</a>
<a id='n566' href='#n566'>566</a>
<a id='n567' href='#n567'>567</a>
<a id='n568' href='#n568'>568</a>
<a id='n569' href='#n569'>569</a>
<a id='n570' href='#n570'>570</a>
<a id='n571' href='#n571'>571</a>
<a id='n572' href='#n572'>572</a>
<a id='n573' href='#n573'>573</a>
<a id='n574' href='#n574'>574</a>
<a id='n575' href='#n575'>575</a>
<a id='n576' href='#n576'>576</a>
<a id='n577' href='#n577'>577</a>
<a id='n578' href='#n578'>578</a>
<a id='n579' href='#n579'>579</a>
<a id='n580' href='#n580'>580</a>
<a id='n581' href='#n581'>581</a>
<a id='n582' href='#n582'>582</a>
<a id='n583' href='#n583'>583</a>
<a id='n584' href='#n584'>584</a>
<a id='n585' href='#n585'>585</a>
<a id='n586' href='#n586'>586</a>
<a id='n587' href='#n587'>587</a>
<a id='n588' href='#n588'>588</a>
<a id='n589' href='#n589'>589</a>
<a id='n590' href='#n590'>590</a>
<a id='n591' href='#n591'>591</a>
<a id='n592' href='#n592'>592</a>
<a id='n593' href='#n593'>593</a>
<a id='n594' href='#n594'>594</a>
<a id='n595' href='#n595'>595</a>
<a id='n596' href='#n596'>596</a>
<a id='n597' href='#n597'>597</a>
<a id='n598' href='#n598'>598</a>
<a id='n599' href='#n599'>599</a>
<a id='n600' href='#n600'>600</a>
<a id='n601' href='#n601'>601</a>
<a id='n602' href='#n602'>602</a>
<a id='n603' href='#n603'>603</a>
<a id='n604' href='#n604'>604</a>
<a id='n605' href='#n605'>605</a>
<a id='n606' href='#n606'>606</a>
<a id='n607' href='#n607'>607</a>
<a id='n608' href='#n608'>608</a>
<a id='n609' href='#n609'>609</a>
<a id='n610' href='#n610'>610</a>
<a id='n611' href='#n611'>611</a>
<a id='n612' href='#n612'>612</a>
<a id='n613' href='#n613'>613</a>
<a id='n614' href='#n614'>614</a>
<a id='n615' href='#n615'>615</a>
<a id='n616' href='#n616'>616</a>
<a id='n617' href='#n617'>617</a>
<a id='n618' href='#n618'>618</a>
<a id='n619' href='#n619'>619</a>
<a id='n620' href='#n620'>620</a>
<a id='n621' href='#n621'>621</a>
<a id='n622' href='#n622'>622</a>
<a id='n623' href='#n623'>623</a>
<a id='n624' href='#n624'>624</a>
<a id='n625' href='#n625'>625</a>
<a id='n626' href='#n626'>626</a>
<a id='n627' href='#n627'>627</a>
<a id='n628' href='#n628'>628</a>
<a id='n629' href='#n629'>629</a>
<a id='n630' href='#n630'>630</a>
<a id='n631' href='#n631'>631</a>
<a id='n632' href='#n632'>632</a>
<a id='n633' href='#n633'>633</a>
<a id='n634' href='#n634'>634</a>
<a id='n635' href='#n635'>635</a>
<a id='n636' href='#n636'>636</a>
<a id='n637' href='#n637'>637</a>
<a id='n638' href='#n638'>638</a>
<a id='n639' href='#n639'>639</a>
<a id='n640' href='#n640'>640</a>
<a id='n641' href='#n641'>641</a>
<a id='n642' href='#n642'>642</a>
<a id='n643' href='#n643'>643</a>
<a id='n644' href='#n644'>644</a>
<a id='n645' href='#n645'>645</a>
<a id='n646' href='#n646'>646</a>
<a id='n647' href='#n647'>647</a>
<a id='n648' href='#n648'>648</a>
<a id='n649' href='#n649'>649</a>
<a id='n650' href='#n650'>650</a>
<a id='n651' href='#n651'>651</a>
<a id='n652' href='#n652'>652</a>
<a id='n653' href='#n653'>653</a>
<a id='n654' href='#n654'>654</a>
<a id='n655' href='#n655'>655</a>
<a id='n656' href='#n656'>656</a>
<a id='n657' href='#n657'>657</a>
<a id='n658' href='#n658'>658</a>
<a id='n659' href='#n659'>659</a>
<a id='n660' href='#n660'>660</a>
<a id='n661' href='#n661'>661</a>
<a id='n662' href='#n662'>662</a>
<a id='n663' href='#n663'>663</a>
<a id='n664' href='#n664'>664</a>
<a id='n665' href='#n665'>665</a>
<a id='n666' href='#n666'>666</a>
<a id='n667' href='#n667'>667</a>
<a id='n668' href='#n668'>668</a>
<a id='n669' href='#n669'>669</a>
<a id='n670' href='#n670'>670</a>
<a id='n671' href='#n671'>671</a>
<a id='n672' href='#n672'>672</a>
<a id='n673' href='#n673'>673</a>
<a id='n674' href='#n674'>674</a>
<a id='n675' href='#n675'>675</a>
<a id='n676' href='#n676'>676</a>
<a id='n677' href='#n677'>677</a>
<a id='n678' href='#n678'>678</a>
<a id='n679' href='#n679'>679</a>
<a id='n680' href='#n680'>680</a>
<a id='n681' href='#n681'>681</a>
<a id='n682' href='#n682'>682</a>
<a id='n683' href='#n683'>683</a>
<a id='n684' href='#n684'>684</a>
<a id='n685' href='#n685'>685</a>
<a id='n686' href='#n686'>686</a>
<a id='n687' href='#n687'>687</a>
<a id='n688' href='#n688'>688</a>
<a id='n689' href='#n689'>689</a>
<a id='n690' href='#n690'>690</a>
<a id='n691' href='#n691'>691</a>
<a id='n692' href='#n692'>692</a>
<a id='n693' href='#n693'>693</a>
<a id='n694' href='#n694'>694</a>
<a id='n695' href='#n695'>695</a>
<a id='n696' href='#n696'>696</a>
<a id='n697' href='#n697'>697</a>
<a id='n698' href='#n698'>698</a>
<a id='n699' href='#n699'>699</a>
<a id='n700' href='#n700'>700</a>
<a id='n701' href='#n701'>701</a>
<a id='n702' href='#n702'>702</a>
</pre></td>
<td class='lines'><pre><code><span class="hl kwa">\section</span><span class="hl opt">{</span><span class="hl kwa">\module</span><span class="hl opt">{</span>difflib<span class="hl opt">}</span> ---
         Helpers for computing deltas<span class="hl opt">}</span>

<span class="hl kwa">\declaremodule</span><span class="hl opt">{</span>standard<span class="hl opt">}{</span>difflib<span class="hl opt">}</span>
<span class="hl kwa">\modulesynopsis</span><span class="hl opt">{</span>Helpers for computing differences between objects.<span class="hl opt">}</span>
<span class="hl kwa">\moduleauthor</span><span class="hl opt">{</span>Tim Peters<span class="hl opt">}{</span>tim_one&#64;users.sourceforge.net<span class="hl opt">}</span>
<span class="hl kwa">\sectionauthor</span><span class="hl opt">{</span>Tim Peters<span class="hl opt">}{</span>tim_one&#64;users.sourceforge.net<span class="hl opt">}</span>
<span class="hl slc">% LaTeXification by Fred L. Drake, Jr. &lt;fdrake&#64;acm.org&gt;.</span>

<span class="hl kwa">\versionadded</span><span class="hl opt">{</span><span class="hl num">2.1</span><span class="hl opt">}</span>


<span class="hl kwa">\begin</span><span class="hl opt">{</span>classdesc*<span class="hl opt">}{</span>SequenceMatcher<span class="hl opt">}</span>
  This is a flexible class for comparing pairs of sequences of any
  type, so long as the sequence elements are hashable.  The basic
  algorithm predates, and is a little fancier than, an algorithm
  published in the late <span class="hl num">1980</span>'s by Ratcliff and Obershelp under the
  hyperbolic name ``gestalt pattern matching.''  The idea is to find
  the longest contiguous matching subsequence that contains no
  ``junk'' elements (the Ratcliff and Obershelp algorithm doesn't
  address junk).  The same idea is then applied recursively to the
  pieces of the sequences to the left and to the right of the matching
  subsequence.  This does not yield minimal edit sequences, but does
  tend to yield matches that ``look right'' to people.

  <span class="hl kwa">\strong</span><span class="hl opt">{</span>Timing:<span class="hl opt">}</span> The basic Ratcliff-Obershelp algorithm is cubic
  time in the worst case and quadratic time in the expected case.
  <span class="hl kwa">\class</span><span class="hl opt">{</span>SequenceMatcher<span class="hl opt">}</span> is quadratic time for the worst case and has
  expected-case behavior dependent in a complicated way on how many
  elements the sequences have in common; best case time is linear.
<span class="hl kwa">\end</span><span class="hl opt">{</span>classdesc*<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>classdesc*<span class="hl opt">}{</span>Differ<span class="hl opt">}</span>
  This is a class for comparing sequences of lines of text, and
  producing human-readable differences or deltas.  Differ uses
  <span class="hl kwa">\class</span><span class="hl opt">{</span>SequenceMatcher<span class="hl opt">}</span> both to compare sequences of lines, and to
  compare sequences of characters within similar (near-matching)
  lines.

  Each line of a <span class="hl kwa">\class</span><span class="hl opt">{</span>Differ<span class="hl opt">}</span> delta begins with a two-letter code:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>tableii<span class="hl opt">}{</span>l|l<span class="hl opt">}{</span>code<span class="hl opt">}{</span>Code<span class="hl opt">}{</span>Meaning<span class="hl opt">}</span>
  <span class="hl kwa">\lineii</span><span class="hl opt">{</span>'- '<span class="hl opt">}{</span>line unique to sequence <span class="hl num">1</span><span class="hl opt">}</span>
  <span class="hl kwa">\lineii</span><span class="hl opt">{</span>'+ '<span class="hl opt">}{</span>line unique to sequence <span class="hl num">2</span><span class="hl opt">}</span>
  <span class="hl kwa">\lineii</span><span class="hl opt">{</span>'  '<span class="hl opt">}{</span>line common to both sequences<span class="hl opt">}</span>
  <span class="hl kwa">\lineii</span><span class="hl opt">{</span>'? '<span class="hl opt">}{</span>line not present in either input sequence<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>tableii<span class="hl opt">}</span>

  Lines beginning with `<span class="hl kwa">\code</span><span class="hl opt">{</span>?~<span class="hl opt">}</span>' attempt to guide the eye to
  intraline differences, and were not present in either input
  sequence. These lines can be confusing if the sequences contain tab
  characters.
<span class="hl kwa">\end</span><span class="hl opt">{</span>classdesc*<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>classdesc*<span class="hl opt">}{</span>HtmlDiff<span class="hl opt">}</span>

  This class can be used to create an HTML table (or a complete HTML file
  containing the table) showing a side by side, line by line comparison
  of text with inter-line and intra-line change highlights.  The table can
  be generated in either full or contextual difference mode.

  The constructor for this class is:

  <span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>__init__<span class="hl opt">}{</span>
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, tabsize
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, wrapcolumn
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, linejunk
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, charjunk<span class="hl opt">}}}}}</span>

    Initializes instance of <span class="hl kwa">\class</span><span class="hl opt">{</span>HtmlDiff<span class="hl opt">}</span>.

    <span class="hl kwa">\var</span><span class="hl opt">{</span>tabsize<span class="hl opt">}</span> is an optional keyword argument to specify tab stop spacing
    and defaults to <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl num">8</span><span class="hl opt">}</span>.

    <span class="hl kwa">\var</span><span class="hl opt">{</span>wrapcolumn<span class="hl opt">}</span> is an optional keyword to specify column number where
    lines are broken and wrapped, defaults to <span class="hl kwa">\code</span><span class="hl opt">{</span>None<span class="hl opt">}</span> where lines are not
    wrapped.

    <span class="hl kwa">\var</span><span class="hl opt">{</span>linejunk<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>charjunk<span class="hl opt">}</span> are optional keyword arguments passed
    into <span class="hl kwa">\code</span><span class="hl opt">{</span>ndiff()<span class="hl opt">}</span> (used by <span class="hl kwa">\class</span><span class="hl opt">{</span>HtmlDiff<span class="hl opt">}</span> to generate the
    side by side HTML differences).  See <span class="hl kwa">\code</span><span class="hl opt">{</span>ndiff()<span class="hl opt">}</span> documentation for
    argument default values and descriptions.

  <span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

  The following methods are public:

  <span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>make_file<span class="hl opt">}{</span>fromlines, tolines
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, fromdesc
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, todesc
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, context
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, numlines<span class="hl opt">}}}}}</span>
    Compares <span class="hl kwa">\var</span><span class="hl opt">{</span>fromlines<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>tolines<span class="hl opt">}</span> (lists of strings) and returns
    a string which is a complete HTML file containing a table showing line by
    line differences with inter-line and intra-line changes highlighted.

    <span class="hl kwa">\var</span><span class="hl opt">{</span>fromdesc<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>todesc<span class="hl opt">}</span> are optional keyword arguments to specify
    from/to file column header strings (both default to an empty string).

    <span class="hl kwa">\var</span><span class="hl opt">{</span>context<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>numlines<span class="hl opt">}</span> are both optional keyword arguments.
    Set <span class="hl kwa">\var</span><span class="hl opt">{</span>context<span class="hl opt">}</span> to <span class="hl kwa">\code</span><span class="hl opt">{</span>True<span class="hl opt">}</span> when contextual differences are to be
    shown, else the default is <span class="hl kwa">\code</span><span class="hl opt">{</span>False<span class="hl opt">}</span> to show the full files.
    <span class="hl kwa">\var</span><span class="hl opt">{</span>numlines<span class="hl opt">}</span> defaults to <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl num">5</span><span class="hl opt">}</span>.  When <span class="hl kwa">\var</span><span class="hl opt">{</span>context<span class="hl opt">}</span> is <span class="hl kwa">\code</span><span class="hl opt">{</span>True<span class="hl opt">}</span>
    <span class="hl kwa">\var</span><span class="hl opt">{</span>numlines<span class="hl opt">}</span> controls the number of context lines which surround the
    difference highlights.  When <span class="hl kwa">\var</span><span class="hl opt">{</span>context<span class="hl opt">}</span> is <span class="hl kwa">\code</span><span class="hl opt">{</span>False<span class="hl opt">}</span> <span class="hl kwa">\var</span><span class="hl opt">{</span>numlines<span class="hl opt">}</span>
    controls the number of lines which are shown before a difference
    highlight when using the &quot;next&quot; hyperlinks (setting to zero would cause
    the &quot;next&quot; hyperlinks to place the next difference highlight at the top of
    the browser without any leading context).
  <span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

  <span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>make_table<span class="hl opt">}{</span>fromlines, tolines
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, fromdesc
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, todesc
    <span class="hl kwa">\optional</span><span class="hl opt">{</span>, context<span class="hl opt">}}}}</span>
    Compares <span class="hl kwa">\var</span><span class="hl opt">{</span>fromlines<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>tolines<span class="hl opt">}</span> (lists of strings) and returns
    a string which is a complete HTML table showing line by line differences
    with inter-line and intra-line changes highlighted.

    The arguments of this method are a subset of those for the
    <span class="hl kwa">\code</span><span class="hl opt">{</span>make_file<span class="hl opt">}</span> method.  Refer to the <span class="hl kwa">\code</span><span class="hl opt">{</span>make_file<span class="hl opt">}</span> method
    documentation.
  <span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

  <span class="hl kwa">\file</span><span class="hl opt">{</span>Tools/scripts/diff.py<span class="hl opt">}</span> is a command-line front-end to this class
  and contains a good example of its use.

  <span class="hl kwa">\versionadded</span><span class="hl opt">{</span><span class="hl num">2.4</span><span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>classdesc*<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>context_diff<span class="hl opt">}{</span>a, b<span class="hl kwa">\optional</span><span class="hl opt">{</span>, fromfile<span class="hl kwa">\optional</span><span class="hl opt">{</span>, tofile
	<span class="hl kwa">\optional</span><span class="hl opt">{</span>, fromfiledate<span class="hl kwa">\optional</span><span class="hl opt">{</span>, tofiledate<span class="hl kwa">\optional</span><span class="hl opt">{</span>, n
	<span class="hl kwa">\optional</span><span class="hl opt">{</span>, lineterm<span class="hl opt">}}}}}}}</span>
  Compare <span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}</span> (lists of strings); return a
  delta (a generator generating the delta lines) in context diff
  format.

  Context diffs are a compact way of showing just the lines that have
  changed plus a few lines of context.  The changes are shown in a
  before/after style.  The number of context lines is set by <span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}</span>
  which defaults to three.

  By default, the diff control lines (those with <span class="hl kwa">\code</span><span class="hl opt">{</span>***<span class="hl opt">}</span> or <span class="hl kwa">\code</span><span class="hl opt">{</span>---<span class="hl opt">}</span>)
  are created with a trailing newline.  This is helpful so that inputs created
  from <span class="hl kwa">\function</span><span class="hl opt">{</span>file.readlines()<span class="hl opt">}</span> result in diffs that are suitable for use
  with <span class="hl kwa">\function</span><span class="hl opt">{</span>file.writelines()<span class="hl opt">}</span> since both the inputs and outputs have
  trailing newlines.

  For inputs that do not have trailing newlines, set the <span class="hl kwa">\var</span><span class="hl opt">{</span>lineterm<span class="hl opt">}</span>
  argument to <span class="hl kwa">\code</span><span class="hl opt">{</span>&quot;&quot;<span class="hl opt">}</span> so that the output will be uniformly newline free.

  The context diff format normally has a header for filenames and
  modification times.  Any or all of these may be specified using strings for
  <span class="hl kwa">\var</span><span class="hl opt">{</span>fromfile<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>tofile<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>fromfiledate<span class="hl opt">}</span>, and <span class="hl kwa">\var</span><span class="hl opt">{</span>tofiledate<span class="hl opt">}</span>.
  The modification times are normally expressed in the format returned by
  <span class="hl kwa">\function</span><span class="hl opt">{</span>time.ctime()<span class="hl opt">}</span>.  If not specified, the strings default to blanks.

  <span class="hl kwa">\file</span><span class="hl opt">{</span>Tools/scripts/diff.py<span class="hl opt">}</span> is a command-line front-end for this
  function.

  <span class="hl kwa">\versionadded</span><span class="hl opt">{</span><span class="hl num">2.3</span><span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>get_close_matches<span class="hl opt">}{</span>word, possibilities<span class="hl kwa">\optional</span><span class="hl opt">{</span>,
                 n<span class="hl kwa">\optional</span><span class="hl opt">{</span>, cutoff<span class="hl opt">}}}</span>
  Return a list of the best ``good enough'' matches.  <span class="hl kwa">\var</span><span class="hl opt">{</span>word<span class="hl opt">}</span> is a
  sequence for which close matches are desired (typically a string),
  and <span class="hl kwa">\var</span><span class="hl opt">{</span>possibilities<span class="hl opt">}</span> is a list of sequences against which to
  match <span class="hl kwa">\var</span><span class="hl opt">{</span>word<span class="hl opt">}</span> (typically a list of strings).

  Optional argument <span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}</span> (default <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl num">3</span><span class="hl opt">}</span>) is the maximum number
  of close matches to return; <span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}</span> must be greater than <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl num">0</span><span class="hl opt">}</span>.

  Optional argument <span class="hl kwa">\var</span><span class="hl opt">{</span>cutoff<span class="hl opt">}</span> (default <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl num">0.6</span><span class="hl opt">}</span>) is a float in
  the range <span class="hl opt">[</span><span class="hl num">0</span>, <span class="hl num">1</span><span class="hl opt">]</span>.  Possibilities that don't score at least that
  similar to <span class="hl kwa">\var</span><span class="hl opt">{</span>word<span class="hl opt">}</span> are ignored.

  The best (no more than <span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}</span>) matches among the possibilities are
  returned in a list, sorted by similarity score, most similar first.

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; get_close_matches('appel', <span class="hl opt">[</span>'ape', 'apple', 'peach', 'puppy'<span class="hl opt">]</span>)
<span class="hl opt">[</span>'apple', 'ape'<span class="hl opt">]</span>
&gt;&gt;&gt; import keyword
&gt;&gt;&gt; get_close_matches('wheel', keyword.kwlist)
<span class="hl opt">[</span>'while'<span class="hl opt">]</span>
&gt;&gt;&gt; get_close_matches('apple', keyword.kwlist)
<span class="hl opt">[]</span>
&gt;&gt;&gt; get_close_matches('accept', keyword.kwlist)
<span class="hl opt">[</span>'except'<span class="hl opt">]</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>ndiff<span class="hl opt">}{</span>a, b<span class="hl kwa">\optional</span><span class="hl opt">{</span>, linejunk<span class="hl kwa">\optional</span><span class="hl opt">{</span>,
                 charjunk<span class="hl opt">}}}</span>
  Compare <span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}</span> (lists of strings); return a
  <span class="hl kwa">\class</span><span class="hl opt">{</span>Differ<span class="hl opt">}</span>-style delta (a generator generating the delta lines).

  Optional keyword parameters <span class="hl kwa">\var</span><span class="hl opt">{</span>linejunk<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>charjunk<span class="hl opt">}</span> are
  for filter functions (or <span class="hl kwa">\code</span><span class="hl opt">{</span>None<span class="hl opt">}</span>):

  <span class="hl kwa">\var</span><span class="hl opt">{</span>linejunk<span class="hl opt">}</span>: A function that accepts a single string
  argument, and returns true if the string is junk, or false if not.
  The default is (<span class="hl kwa">\code</span><span class="hl opt">{</span>None<span class="hl opt">}</span>), starting with Python <span class="hl num">2.3</span>.  Before then,
  the default was the module-level function
  <span class="hl kwa">\function</span><span class="hl opt">{</span>IS_LINE_JUNK()<span class="hl opt">}</span>, which filters out lines without visible
  characters, except for at most one pound character (<span class="hl kwa">\character</span><span class="hl opt">{</span>\#<span class="hl opt">}</span>).
  As of Python <span class="hl num">2.3</span>, the underlying <span class="hl kwa">\class</span><span class="hl opt">{</span>SequenceMatcher<span class="hl opt">}</span> class
  does a dynamic analysis of which lines are so frequent as to
  constitute noise, and this usually works better than the pre-<span class="hl num">2.3</span>
  default.

  <span class="hl kwa">\var</span><span class="hl opt">{</span>charjunk<span class="hl opt">}</span>: A function that accepts a character (a string of
  length <span class="hl num">1</span>), and returns if the character is junk, or false if not.
  The default is module-level function <span class="hl kwa">\function</span><span class="hl opt">{</span>IS_CHARACTER_JUNK()<span class="hl opt">}</span>,
  which filters out whitespace characters (a blank or tab; note: bad
  idea to include newline in this!).

  <span class="hl kwa">\file</span><span class="hl opt">{</span>Tools/scripts/ndiff.py<span class="hl opt">}</span> is a command-line front-end to this
  function.

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; diff = ndiff('one<span class="hl kwa">\ntwo\nthree\n</span>'.splitlines(<span class="hl num">1</span>),
...              'ore<span class="hl kwa">\ntree\nemu\n</span>'.splitlines(<span class="hl num">1</span>))
&gt;&gt;&gt; print ''.join(diff),
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>restore<span class="hl opt">}{</span>sequence, which<span class="hl opt">}</span>
  Return one of the two sequences that generated a delta.

  Given a <span class="hl kwa">\var</span><span class="hl opt">{</span>sequence<span class="hl opt">}</span> produced by <span class="hl kwa">\method</span><span class="hl opt">{</span>Differ.compare()<span class="hl opt">}</span> or
  <span class="hl kwa">\function</span><span class="hl opt">{</span>ndiff()<span class="hl opt">}</span>, extract lines originating from file <span class="hl num">1</span> or <span class="hl num">2</span>
  (parameter <span class="hl kwa">\var</span><span class="hl opt">{</span>which<span class="hl opt">}</span>), stripping off line prefixes.

  Example:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; diff = ndiff('one<span class="hl kwa">\ntwo\nthree\n</span>'.splitlines(<span class="hl num">1</span>),
...              'ore<span class="hl kwa">\ntree\nemu\n</span>'.splitlines(<span class="hl num">1</span>))
&gt;&gt;&gt; diff = list(diff) # materialize the generated delta into a list
&gt;&gt;&gt; print ''.join(restore(diff, <span class="hl num">1</span>)),
one
two
three
&gt;&gt;&gt; print ''.join(restore(diff, <span class="hl num">2</span>)),
ore
tree
emu
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>unified_diff<span class="hl opt">}{</span>a, b<span class="hl kwa">\optional</span><span class="hl opt">{</span>, fromfile<span class="hl kwa">\optional</span><span class="hl opt">{</span>, tofile
	<span class="hl kwa">\optional</span><span class="hl opt">{</span>, fromfiledate<span class="hl kwa">\optional</span><span class="hl opt">{</span>, tofiledate<span class="hl kwa">\optional</span><span class="hl opt">{</span>, n
	<span class="hl kwa">\optional</span><span class="hl opt">{</span>, lineterm<span class="hl opt">}}}}}}}</span>
  Compare <span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}</span> (lists of strings); return a
  delta (a generator generating the delta lines) in unified diff
  format.

  Unified diffs are a compact way of showing just the lines that have
  changed plus a few lines of context.  The changes are shown in a
  inline style (instead of separate before/after blocks).  The number
  of context lines is set by <span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}</span> which defaults to three.

  By default, the diff control lines (those with <span class="hl kwa">\code</span><span class="hl opt">{</span>---<span class="hl opt">}</span>, <span class="hl kwa">\code</span><span class="hl opt">{</span>+++<span class="hl opt">}</span>,
  or <span class="hl kwa">\code</span><span class="hl opt">{</span>&#64;&#64;<span class="hl opt">}</span>) are created with a trailing newline.  This is helpful so
  that inputs created from <span class="hl kwa">\function</span><span class="hl opt">{</span>file.readlines()<span class="hl opt">}</span> result in diffs
  that are suitable for use with <span class="hl kwa">\function</span><span class="hl opt">{</span>file.writelines()<span class="hl opt">}</span> since both
  the inputs and outputs have trailing newlines.

  For inputs that do not have trailing newlines, set the <span class="hl kwa">\var</span><span class="hl opt">{</span>lineterm<span class="hl opt">}</span>
  argument to <span class="hl kwa">\code</span><span class="hl opt">{</span>&quot;&quot;<span class="hl opt">}</span> so that the output will be uniformly newline free.

  The context diff format normally has a header for filenames and
  modification times.  Any or all of these may be specified using strings for
  <span class="hl kwa">\var</span><span class="hl opt">{</span>fromfile<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>tofile<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>fromfiledate<span class="hl opt">}</span>, and <span class="hl kwa">\var</span><span class="hl opt">{</span>tofiledate<span class="hl opt">}</span>.
  The modification times are normally expressed in the format returned by
  <span class="hl kwa">\function</span><span class="hl opt">{</span>time.ctime()<span class="hl opt">}</span>.  If not specified, the strings default to blanks.

  <span class="hl kwa">\file</span><span class="hl opt">{</span>Tools/scripts/diff.py<span class="hl opt">}</span> is a command-line front-end for this
  function.

  <span class="hl kwa">\versionadded</span><span class="hl opt">{</span><span class="hl num">2.3</span><span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>IS_LINE_JUNK<span class="hl opt">}{</span>line<span class="hl opt">}</span>
  Return true for ignorable lines.  The line <span class="hl kwa">\var</span><span class="hl opt">{</span>line<span class="hl opt">}</span> is ignorable
  if <span class="hl kwa">\var</span><span class="hl opt">{</span>line<span class="hl opt">}</span> is blank or contains a single <span class="hl kwa">\character</span><span class="hl opt">{</span>\#<span class="hl opt">}</span>,
  otherwise it is not ignorable.  Used as a default for parameter
  <span class="hl kwa">\var</span><span class="hl opt">{</span>linejunk<span class="hl opt">}</span> in <span class="hl kwa">\function</span><span class="hl opt">{</span>ndiff()<span class="hl opt">}</span> before Python <span class="hl num">2.3</span>.
<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>


<span class="hl kwa">\begin</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}{</span>IS_CHARACTER_JUNK<span class="hl opt">}{</span>ch<span class="hl opt">}</span>
  Return true for ignorable characters.  The character <span class="hl kwa">\var</span><span class="hl opt">{</span>ch<span class="hl opt">}</span> is
  ignorable if <span class="hl kwa">\var</span><span class="hl opt">{</span>ch<span class="hl opt">}</span> is a space or tab, otherwise it is not
  ignorable.  Used as a default for parameter <span class="hl kwa">\var</span><span class="hl opt">{</span>charjunk<span class="hl opt">}</span> in
  <span class="hl kwa">\function</span><span class="hl opt">{</span>ndiff()<span class="hl opt">}</span>.
<span class="hl kwa">\end</span><span class="hl opt">{</span>funcdesc<span class="hl opt">}</span>


<span class="hl kwa">\begin</span><span class="hl opt">{</span>seealso<span class="hl opt">}</span>
  <span class="hl kwa">\seetitle</span><span class="hl opt">[</span>http://www.ddj.com/documents/s=<span class="hl num">1103</span>/ddj8807c/<span class="hl opt">]</span>
           <span class="hl opt">{</span>Pattern Matching: The Gestalt Approach<span class="hl opt">}{</span>Discussion of a
            similar algorithm by John W. Ratcliff and D. E. Metzener.
            This was published in
            <span class="hl kwa">\citetitle</span><span class="hl opt">[</span>http://www.ddj.com/<span class="hl opt">]{</span>Dr. Dobb's Journal<span class="hl opt">}</span> in
            July, <span class="hl num">1988</span>.<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>seealso<span class="hl opt">}</span>


<span class="hl kwa">\subsection</span><span class="hl opt">{</span>SequenceMatcher Objects <span class="hl kwa">\label</span><span class="hl opt">{</span>sequence-matcher<span class="hl opt">}}</span>

The <span class="hl kwa">\class</span><span class="hl opt">{</span>SequenceMatcher<span class="hl opt">}</span> class has this constructor:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>classdesc<span class="hl opt">}{</span>SequenceMatcher<span class="hl opt">}{</span><span class="hl kwa">\optional</span><span class="hl opt">{</span>isjunk<span class="hl kwa">\optional</span><span class="hl opt">{</span>,
                                   a<span class="hl kwa">\optional</span><span class="hl opt">{</span>, b<span class="hl opt">}}}}</span>
  Optional argument <span class="hl kwa">\var</span><span class="hl opt">{</span>isjunk<span class="hl opt">}</span> must be <span class="hl kwa">\code</span><span class="hl opt">{</span>None<span class="hl opt">}</span> (the default) or
  a one-argument function that takes a sequence element and returns
  true if and only if the element is ``junk'' and should be ignored.
  Passing <span class="hl kwa">\code</span><span class="hl opt">{</span>None<span class="hl opt">}</span> for <span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}</span> is equivalent to passing
  <span class="hl kwa">\code</span><span class="hl opt">{</span>lambda x: <span class="hl num">0</span><span class="hl opt">}</span>; in other words, no elements are ignored.  For
  example, pass:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
lambda x: x in &quot; <span class="hl kwa">\t</span>&quot;
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

  if you're comparing lines as sequences of characters, and don't want
  to synch up on blanks or hard tabs.

  The optional arguments <span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}</span> are sequences to be
  compared; both default to empty strings.  The elements of both
  sequences must be hashable.
<span class="hl kwa">\end</span><span class="hl opt">{</span>classdesc<span class="hl opt">}</span>


<span class="hl kwa">\class</span><span class="hl opt">{</span>SequenceMatcher<span class="hl opt">}</span> objects have the following methods:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>set_seqs<span class="hl opt">}{</span>a, b<span class="hl opt">}</span>
  Set the two sequences to be compared.
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

<span class="hl kwa">\class</span><span class="hl opt">{</span>SequenceMatcher<span class="hl opt">}</span> computes and caches detailed information about
the second sequence, so if you want to compare one sequence against
many sequences, use <span class="hl kwa">\method</span><span class="hl opt">{</span>set_seq2()<span class="hl opt">}</span> to set the commonly used
sequence once and call <span class="hl kwa">\method</span><span class="hl opt">{</span>set_seq1()<span class="hl opt">}</span> repeatedly, once for each
of the other sequences.

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>set_seq1<span class="hl opt">}{</span>a<span class="hl opt">}</span>
  Set the first sequence to be compared.  The second sequence to be
  compared is not changed.
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>set_seq2<span class="hl opt">}{</span>b<span class="hl opt">}</span>
  Set the second sequence to be compared.  The first sequence to be
  compared is not changed.
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>find_longest_match<span class="hl opt">}{</span>alo, ahi, blo, bhi<span class="hl opt">}</span>
  Find longest matching block in <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>alo<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>ahi<span class="hl opt">}]}</span>
  and <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>blo<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>bhi<span class="hl opt">}]}</span>.

  If <span class="hl kwa">\var</span><span class="hl opt">{</span>isjunk<span class="hl opt">}</span> was omitted or <span class="hl kwa">\code</span><span class="hl opt">{</span>None<span class="hl opt">}</span>,
  <span class="hl kwa">\method</span><span class="hl opt">{</span>get_longest_match()<span class="hl opt">}</span> returns <span class="hl kwa">\code</span><span class="hl opt">{</span>(<span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span>,
  <span class="hl kwa">\var</span><span class="hl opt">{</span>k<span class="hl opt">}</span>)<span class="hl opt">}</span> such that <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span>+<span class="hl kwa">\var</span><span class="hl opt">{</span>k<span class="hl opt">}]}</span> is equal
  to <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span>+<span class="hl kwa">\var</span><span class="hl opt">{</span>k<span class="hl opt">}]}</span>, where
      <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>alo<span class="hl opt">}</span> &lt;= <span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span> &lt;= <span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span>+<span class="hl kwa">\var</span><span class="hl opt">{</span>k<span class="hl opt">}</span> &lt;= <span class="hl kwa">\var</span><span class="hl opt">{</span>ahi<span class="hl opt">}}</span> and
      <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>blo<span class="hl opt">}</span> &lt;= <span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span> &lt;= <span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span>+<span class="hl kwa">\var</span><span class="hl opt">{</span>k<span class="hl opt">}</span> &lt;= <span class="hl kwa">\var</span><span class="hl opt">{</span>bhi<span class="hl opt">}}</span>.
  For all <span class="hl kwa">\code</span><span class="hl opt">{</span>(<span class="hl kwa">\var</span><span class="hl opt">{</span>i'<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>j'<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>k'<span class="hl opt">}</span>)<span class="hl opt">}</span> meeting those
  conditions, the additional conditions
      <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>k<span class="hl opt">}</span> &gt;= <span class="hl kwa">\var</span><span class="hl opt">{</span>k'<span class="hl opt">}}</span>,
      <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span> &lt;= <span class="hl kwa">\var</span><span class="hl opt">{</span>i'<span class="hl opt">}}</span>,
      and if <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span> == <span class="hl kwa">\var</span><span class="hl opt">{</span>i'<span class="hl opt">}}</span>, <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span> &lt;= <span class="hl kwa">\var</span><span class="hl opt">{</span>j'<span class="hl opt">}}</span>
  are also met.
  In other words, of all maximal matching blocks, return one that
  starts earliest in <span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}</span>, and of all those maximal matching blocks
  that start earliest in <span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}</span>, return the one that starts earliest
  in <span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}</span>.

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; s = SequenceMatcher(None, &quot; abcd&quot;, &quot;abcd abcd&quot;)
&gt;&gt;&gt; s.find_longest_match(<span class="hl num">0</span>, <span class="hl num">5</span>, <span class="hl num">0</span>, <span class="hl num">9</span>)
(<span class="hl num">0</span>, <span class="hl num">4</span>, <span class="hl num">5</span>)
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

  If <span class="hl kwa">\var</span><span class="hl opt">{</span>isjunk<span class="hl opt">}</span> was provided, first the longest matching block is
  determined as above, but with the additional restriction that no
  junk element appears in the block.  Then that block is extended as
  far as possible by matching (only) junk elements on both sides.
  So the resulting block never matches on junk except as identical
  junk happens to be adjacent to an interesting match.

  Here's the same example as before, but considering blanks to be junk.
  That prevents <span class="hl kwa">\code</span><span class="hl opt">{</span>' abcd'<span class="hl opt">}</span> from matching the <span class="hl kwa">\code</span><span class="hl opt">{</span>' abcd'<span class="hl opt">}</span> at the
  tail end of the second sequence directly.  Instead only the
  <span class="hl kwa">\code</span><span class="hl opt">{</span>'abcd'<span class="hl opt">}</span> can match, and matches the leftmost <span class="hl kwa">\code</span><span class="hl opt">{</span>'abcd'<span class="hl opt">}</span> in
  the second sequence:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; s = SequenceMatcher(lambda x: x==&quot; &quot;, &quot; abcd&quot;, &quot;abcd abcd&quot;)
&gt;&gt;&gt; s.find_longest_match(<span class="hl num">0</span>, <span class="hl num">5</span>, <span class="hl num">0</span>, <span class="hl num">9</span>)
(<span class="hl num">1</span>, <span class="hl num">0</span>, <span class="hl num">4</span>)
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

  If no blocks match, this returns <span class="hl kwa">\code</span><span class="hl opt">{</span>(<span class="hl kwa">\var</span><span class="hl opt">{</span>alo<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>blo<span class="hl opt">}</span>, <span class="hl num">0</span>)<span class="hl opt">}</span>.
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>get_matching_blocks<span class="hl opt">}{}</span>
  Return list of triples describing matching subsequences.
  Each triple is of the form <span class="hl kwa">\code</span><span class="hl opt">{</span>(<span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}</span>)<span class="hl opt">}</span>, and
  means that <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span>+<span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}]</span> ==
  <span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span>+<span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}]}</span>.  The triples are monotonically
  increasing in <span class="hl kwa">\var</span><span class="hl opt">{</span>i<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>j<span class="hl opt">}</span>.

  The last triple is a dummy, and has the value <span class="hl kwa">\code</span><span class="hl opt">{</span>(len(<span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}</span>),
  len(<span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}</span>), <span class="hl num">0</span>)<span class="hl opt">}</span>.  It is the only triple with <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}</span> == <span class="hl num">0</span><span class="hl opt">}</span>.
  <span class="hl slc">% Explain why a dummy is used!</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; s = SequenceMatcher(None, &quot;abxcd&quot;, &quot;abcd&quot;)
&gt;&gt;&gt; s.get_matching_blocks()
<span class="hl opt">[</span>(<span class="hl num">0</span>, <span class="hl num">0</span>, <span class="hl num">2</span>), (<span class="hl num">3</span>, <span class="hl num">2</span>, <span class="hl num">2</span>), (<span class="hl num">5</span>, <span class="hl num">4</span>, <span class="hl num">0</span>)<span class="hl opt">]</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>get_opcodes<span class="hl opt">}{}</span>
  Return list of <span class="hl num">5</span>-tuples describing how to turn <span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}</span> into <span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}</span>.
  Each tuple is of the form <span class="hl kwa">\code</span><span class="hl opt">{</span>(<span class="hl kwa">\var</span><span class="hl opt">{</span>tag<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>i1<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>i2<span class="hl opt">}</span>,
  <span class="hl kwa">\var</span><span class="hl opt">{</span>j1<span class="hl opt">}</span>, <span class="hl kwa">\var</span><span class="hl opt">{</span>j2<span class="hl opt">}</span>)<span class="hl opt">}</span>.  The first tuple has <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i1<span class="hl opt">}</span> ==
  <span class="hl kwa">\var</span><span class="hl opt">{</span>j1<span class="hl opt">}</span> == <span class="hl num">0</span><span class="hl opt">}</span>, and remaining tuples have <span class="hl kwa">\var</span><span class="hl opt">{</span>i1<span class="hl opt">}</span> equal to the
  <span class="hl kwa">\var</span><span class="hl opt">{</span>i2<span class="hl opt">}</span> from the preceeding tuple, and, likewise, <span class="hl kwa">\var</span><span class="hl opt">{</span>j1<span class="hl opt">}</span> equal to
  the previous <span class="hl kwa">\var</span><span class="hl opt">{</span>j2<span class="hl opt">}</span>.

  The <span class="hl kwa">\var</span><span class="hl opt">{</span>tag<span class="hl opt">}</span> values are strings, with these meanings:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>tableii<span class="hl opt">}{</span>l|l<span class="hl opt">}{</span>code<span class="hl opt">}{</span>Value<span class="hl opt">}{</span>Meaning<span class="hl opt">}</span>
  <span class="hl kwa">\lineii</span><span class="hl opt">{</span>'replace'<span class="hl opt">}{</span><span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i1<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>i2<span class="hl opt">}]}</span> should be
                     replaced by <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>j1<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>j2<span class="hl opt">}]}</span>.<span class="hl opt">}</span>
  <span class="hl kwa">\lineii</span><span class="hl opt">{</span>'delete'<span class="hl opt">}{</span><span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i1<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>i2<span class="hl opt">}]}</span> should be
                    deleted.  Note that <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>j1<span class="hl opt">}</span> == <span class="hl kwa">\var</span><span class="hl opt">{</span>j2<span class="hl opt">}}</span> in
                    this case.<span class="hl opt">}</span>
  <span class="hl kwa">\lineii</span><span class="hl opt">{</span>'insert'<span class="hl opt">}{</span><span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>j1<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>j2<span class="hl opt">}]}</span> should be
                    inserted at <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i1<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>i1<span class="hl opt">}]}</span>.
                    Note that <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i1<span class="hl opt">}</span> == <span class="hl kwa">\var</span><span class="hl opt">{</span>i2<span class="hl opt">}}</span> in this
                    case.<span class="hl opt">}</span>
  <span class="hl kwa">\lineii</span><span class="hl opt">{</span>'equal'<span class="hl opt">}{</span><span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>i1<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>i2<span class="hl opt">}]</span> ==
                   <span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}[</span><span class="hl kwa">\var</span><span class="hl opt">{</span>j1<span class="hl opt">}</span>:<span class="hl kwa">\var</span><span class="hl opt">{</span>j2<span class="hl opt">}]}</span> (the sub-sequences are
                   equal).<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>tableii<span class="hl opt">}</span>

For example:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; a = &quot;qabxcd&quot;
&gt;&gt;&gt; b = &quot;abycdf&quot;
&gt;&gt;&gt; s = SequenceMatcher(None, a, b)
&gt;&gt;&gt; for tag, i1, i2, j1, j2 in s.get_opcodes():
...    print (&quot;<span class="hl slc">%7s a[%d:%d] (%s) b[%d:%d] (%s)&quot; %</span>
...           (tag, i1, i2, a<span class="hl opt">[</span>i1:i2<span class="hl opt">]</span>, j1, j2, b<span class="hl opt">[</span>j1:j2<span class="hl opt">]</span>))
 delete a<span class="hl opt">[</span><span class="hl num">0</span>:<span class="hl num">1</span><span class="hl opt">]</span> (q) b<span class="hl opt">[</span><span class="hl num">0</span>:<span class="hl num">0</span><span class="hl opt">]</span> ()
  equal a<span class="hl opt">[</span><span class="hl num">1</span>:<span class="hl num">3</span><span class="hl opt">]</span> (ab) b<span class="hl opt">[</span><span class="hl num">0</span>:<span class="hl num">2</span><span class="hl opt">]</span> (ab)
replace a<span class="hl opt">[</span><span class="hl num">3</span>:<span class="hl num">4</span><span class="hl opt">]</span> (x) b<span class="hl opt">[</span><span class="hl num">2</span>:<span class="hl num">3</span><span class="hl opt">]</span> (y)
  equal a<span class="hl opt">[</span><span class="hl num">4</span>:<span class="hl num">6</span><span class="hl opt">]</span> (cd) b<span class="hl opt">[</span><span class="hl num">3</span>:<span class="hl num">5</span><span class="hl opt">]</span> (cd)
 insert a<span class="hl opt">[</span><span class="hl num">6</span>:<span class="hl num">6</span><span class="hl opt">]</span> () b<span class="hl opt">[</span><span class="hl num">5</span>:<span class="hl num">6</span><span class="hl opt">]</span> (f)
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>get_grouped_opcodes<span class="hl opt">}{</span><span class="hl kwa">\optional</span><span class="hl opt">{</span>n<span class="hl opt">}}</span>
  Return a generator of groups with up to <span class="hl kwa">\var</span><span class="hl opt">{</span>n<span class="hl opt">}</span> lines of context.

  Starting with the groups returned by <span class="hl kwa">\method</span><span class="hl opt">{</span>get_opcodes()<span class="hl opt">}</span>,
  this method splits out smaller change clusters and eliminates
  intervening ranges which have no changes.

  The groups are returned in the same format as <span class="hl kwa">\method</span><span class="hl opt">{</span>get_opcodes()<span class="hl opt">}</span>.
  <span class="hl kwa">\versionadded</span><span class="hl opt">{</span><span class="hl num">2.3</span><span class="hl opt">}</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>ratio<span class="hl opt">}{}</span>
  Return a measure of the sequences' similarity as a float in the
  range <span class="hl opt">[</span><span class="hl num">0</span>, <span class="hl num">1</span><span class="hl opt">]</span>.

  Where T is the total number of elements in both sequences, and M is
  the number of matches, this is <span class="hl num">2.0</span>*M / T. Note that this is
  <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl num">1.0</span><span class="hl opt">}</span> if the sequences are identical, and <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl num">0.0</span><span class="hl opt">}</span> if they
  have nothing in common.

  This is expensive to compute if <span class="hl kwa">\method</span><span class="hl opt">{</span>get_matching_blocks()<span class="hl opt">}</span> or
  <span class="hl kwa">\method</span><span class="hl opt">{</span>get_opcodes()<span class="hl opt">}</span> hasn't already been called, in which case you
  may want to try <span class="hl kwa">\method</span><span class="hl opt">{</span>quick_ratio()<span class="hl opt">}</span> or
  <span class="hl kwa">\method</span><span class="hl opt">{</span>real_quick_ratio()<span class="hl opt">}</span> first to get an upper bound.
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>quick_ratio<span class="hl opt">}{}</span>
  Return an upper bound on <span class="hl kwa">\method</span><span class="hl opt">{</span>ratio()<span class="hl opt">}</span> relatively quickly.

  This isn't defined beyond that it is an upper bound on
  <span class="hl kwa">\method</span><span class="hl opt">{</span>ratio()<span class="hl opt">}</span>, and is faster to compute.
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>real_quick_ratio<span class="hl opt">}{}</span>
  Return an upper bound on <span class="hl kwa">\method</span><span class="hl opt">{</span>ratio()<span class="hl opt">}</span> very quickly.

  This isn't defined beyond that it is an upper bound on
  <span class="hl kwa">\method</span><span class="hl opt">{</span>ratio()<span class="hl opt">}</span>, and is faster to compute than either
  <span class="hl kwa">\method</span><span class="hl opt">{</span>ratio()<span class="hl opt">}</span> or <span class="hl kwa">\method</span><span class="hl opt">{</span>quick_ratio()<span class="hl opt">}</span>.
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>

The three methods that return the ratio of matching to total characters
can give different results due to differing levels of approximation,
although <span class="hl kwa">\method</span><span class="hl opt">{</span>quick_ratio()<span class="hl opt">}</span> and <span class="hl kwa">\method</span><span class="hl opt">{</span>real_quick_ratio()<span class="hl opt">}</span> are always
at least as large as <span class="hl kwa">\method</span><span class="hl opt">{</span>ratio()<span class="hl opt">}</span>:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; s = SequenceMatcher(None, &quot;abcd&quot;, &quot;bcde&quot;)
&gt;&gt;&gt; s.ratio()
<span class="hl num">0.75</span>
&gt;&gt;&gt; s.quick_ratio()
<span class="hl num">0.75</span>
&gt;&gt;&gt; s.real_quick_ratio()
<span class="hl num">1.0</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>


<span class="hl kwa">\subsection</span><span class="hl opt">{</span>SequenceMatcher Examples <span class="hl kwa">\label</span><span class="hl opt">{</span>sequencematcher-examples<span class="hl opt">}}</span>


This example compares two strings, considering blanks to be ``junk:''

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; s = SequenceMatcher(lambda x: x == &quot; &quot;,
...                     &quot;private Thread currentThread;&quot;,
...                     &quot;private volatile Thread currentThread;&quot;)
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

<span class="hl kwa">\method</span><span class="hl opt">{</span>ratio()<span class="hl opt">}</span> returns a float in <span class="hl opt">[</span><span class="hl num">0</span>, <span class="hl num">1</span><span class="hl opt">]</span>, measuring the similarity
of the sequences.  As a rule of thumb, a <span class="hl kwa">\method</span><span class="hl opt">{</span>ratio()<span class="hl opt">}</span> value over
<span class="hl num">0.6</span> means the sequences are close matches:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; print round(s.ratio(), <span class="hl num">3</span>)
<span class="hl num">0.866</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

If you're only interested in where the sequences match,
<span class="hl kwa">\method</span><span class="hl opt">{</span>get_matching_blocks()<span class="hl opt">}</span> is handy:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; for block in s.get_matching_blocks():
...     print &quot;a<span class="hl opt">[</span><span class="hl slc">%d] and b[%d] match for %d elements&quot; % block</span>
a<span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span> and b<span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">]</span> match for <span class="hl num">8</span> elements
a<span class="hl opt">[</span><span class="hl num">8</span><span class="hl opt">]</span> and b<span class="hl opt">[</span><span class="hl num">17</span><span class="hl opt">]</span> match for <span class="hl num">6</span> elements
a<span class="hl opt">[</span><span class="hl num">14</span><span class="hl opt">]</span> and b<span class="hl opt">[</span><span class="hl num">23</span><span class="hl opt">]</span> match for <span class="hl num">15</span> elements
a<span class="hl opt">[</span><span class="hl num">29</span><span class="hl opt">]</span> and b<span class="hl opt">[</span><span class="hl num">38</span><span class="hl opt">]</span> match for <span class="hl num">0</span> elements
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

Note that the last tuple returned by <span class="hl kwa">\method</span><span class="hl opt">{</span>get_matching_blocks()<span class="hl opt">}</span> is
always a dummy, <span class="hl kwa">\code</span><span class="hl opt">{</span>(len(<span class="hl kwa">\var</span><span class="hl opt">{</span>a<span class="hl opt">}</span>), len(<span class="hl kwa">\var</span><span class="hl opt">{</span>b<span class="hl opt">}</span>), <span class="hl num">0</span>)<span class="hl opt">}</span>, and this is
the only case in which the last tuple element (number of elements
matched) is <span class="hl kwa">\code</span><span class="hl opt">{</span><span class="hl num">0</span><span class="hl opt">}</span>.

If you want to know how to change the first sequence into the second,
use <span class="hl kwa">\method</span><span class="hl opt">{</span>get_opcodes()<span class="hl opt">}</span>:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; for opcode in s.get_opcodes():
...     print &quot;<span class="hl slc">%6s a[%d:%d] b[%d:%d]&quot; % opcode</span>
 equal a<span class="hl opt">[</span><span class="hl num">0</span>:<span class="hl num">8</span><span class="hl opt">]</span> b<span class="hl opt">[</span><span class="hl num">0</span>:<span class="hl num">8</span><span class="hl opt">]</span>
insert a<span class="hl opt">[</span><span class="hl num">8</span>:<span class="hl num">8</span><span class="hl opt">]</span> b<span class="hl opt">[</span><span class="hl num">8</span>:<span class="hl num">17</span><span class="hl opt">]</span>
 equal a<span class="hl opt">[</span><span class="hl num">8</span>:<span class="hl num">14</span><span class="hl opt">]</span> b<span class="hl opt">[</span><span class="hl num">17</span>:<span class="hl num">23</span><span class="hl opt">]</span>
 equal a<span class="hl opt">[</span><span class="hl num">14</span>:<span class="hl num">29</span><span class="hl opt">]</span> b<span class="hl opt">[</span><span class="hl num">23</span>:<span class="hl num">38</span><span class="hl opt">]</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

See also the function <span class="hl kwa">\function</span><span class="hl opt">{</span>get_close_matches()<span class="hl opt">}</span> in this module,
which shows how simple code building on <span class="hl kwa">\class</span><span class="hl opt">{</span>SequenceMatcher<span class="hl opt">}</span> can be
used to do useful work.


<span class="hl kwa">\subsection</span><span class="hl opt">{</span>Differ Objects <span class="hl kwa">\label</span><span class="hl opt">{</span>differ-objects<span class="hl opt">}}</span>

Note that <span class="hl kwa">\class</span><span class="hl opt">{</span>Differ<span class="hl opt">}</span>-generated deltas make no claim to be
<span class="hl kwa">\strong</span><span class="hl opt">{</span>minimal<span class="hl opt">}</span> diffs. To the contrary, minimal diffs are often
counter-intuitive, because they synch up anywhere possible, sometimes
accidental matches <span class="hl num">100</span> pages apart. Restricting synch points to
contiguous matches preserves some notion of locality, at the
occasional cost of producing a longer diff.

The <span class="hl kwa">\class</span><span class="hl opt">{</span>Differ<span class="hl opt">}</span> class has this constructor:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>classdesc<span class="hl opt">}{</span>Differ<span class="hl opt">}{</span><span class="hl kwa">\optional</span><span class="hl opt">{</span>linejunk<span class="hl kwa">\optional</span><span class="hl opt">{</span>, charjunk<span class="hl opt">}}}</span>
  Optional keyword parameters <span class="hl kwa">\var</span><span class="hl opt">{</span>linejunk<span class="hl opt">}</span> and <span class="hl kwa">\var</span><span class="hl opt">{</span>charjunk<span class="hl opt">}</span> are
  for filter functions (or <span class="hl kwa">\code</span><span class="hl opt">{</span>None<span class="hl opt">}</span>):

  <span class="hl kwa">\var</span><span class="hl opt">{</span>linejunk<span class="hl opt">}</span>: A function that accepts a single string
  argument, and returns true if the string is junk.  The default is
  <span class="hl kwa">\code</span><span class="hl opt">{</span>None<span class="hl opt">}</span>, meaning that no line is considered junk.

  <span class="hl kwa">\var</span><span class="hl opt">{</span>charjunk<span class="hl opt">}</span>: A function that accepts a single character argument
  (a string of length <span class="hl num">1</span>), and returns true if the character is junk.
  The default is <span class="hl kwa">\code</span><span class="hl opt">{</span>None<span class="hl opt">}</span>, meaning that no character is
  considered junk.
<span class="hl kwa">\end</span><span class="hl opt">{</span>classdesc<span class="hl opt">}</span>

<span class="hl kwa">\class</span><span class="hl opt">{</span>Differ<span class="hl opt">}</span> objects are used (deltas generated) via a single
method:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}{</span>compare<span class="hl opt">}{</span>a, b<span class="hl opt">}</span>
  Compare two sequences of lines, and generate the delta (a sequence
  of lines).

  Each sequence must contain individual single-line strings ending
  with newlines. Such sequences can be obtained from the
  <span class="hl kwa">\method</span><span class="hl opt">{</span>readlines()<span class="hl opt">}</span> method of file-like objects.  The delta generated
  also consists of newline-terminated strings, ready to be printed as-is
  via the <span class="hl kwa">\method</span><span class="hl opt">{</span>writelines()<span class="hl opt">}</span> method of a file-like object.
<span class="hl kwa">\end</span><span class="hl opt">{</span>methoddesc<span class="hl opt">}</span>


<span class="hl kwa">\subsection</span><span class="hl opt">{</span>Differ Example <span class="hl kwa">\label</span><span class="hl opt">{</span>differ-examples<span class="hl opt">}}</span>

This example compares two texts. First we set up the texts, sequences
of individual single-line strings ending with newlines (such sequences
can also be obtained from the <span class="hl kwa">\method</span><span class="hl opt">{</span>readlines()<span class="hl opt">}</span> method of file-like
objects):

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; text1 = '''  <span class="hl num">1</span>. Beautiful is better than ugly.
...   <span class="hl num">2</span>. Explicit is better than implicit.
...   <span class="hl num">3</span>. Simple is better than complex.
...   <span class="hl num">4</span>. Complex is better than complicated.
... '''.splitlines(<span class="hl num">1</span>)
&gt;&gt;&gt; len(text1)
<span class="hl num">4</span>
&gt;&gt;&gt; text1<span class="hl opt">[</span><span class="hl num">0</span><span class="hl opt">][</span>-<span class="hl num">1</span><span class="hl opt">]</span>
'<span class="hl kwa">\n</span>'
&gt;&gt;&gt; text2 = '''  <span class="hl num">1</span>. Beautiful is better than ugly.
...   <span class="hl num">3</span>.   Simple is better than complex.
...   <span class="hl num">4</span>. Complicated is better than complex.
...   <span class="hl num">5</span>. Flat is better than nested.
... '''.splitlines(<span class="hl num">1</span>)
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

Next we instantiate a Differ object:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; d = Differ()
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

Note that when instantiating a <span class="hl kwa">\class</span><span class="hl opt">{</span>Differ<span class="hl opt">}</span> object we may pass
functions to filter out line and character ``junk.''  See the
<span class="hl kwa">\method</span><span class="hl opt">{</span>Differ()<span class="hl opt">}</span> constructor for details.

Finally, we compare the two:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; result = list(d.compare(text1, text2))
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

<span class="hl kwa">\code</span><span class="hl opt">{</span>result<span class="hl opt">}</span> is a list of strings, so let's pretty-print it:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; from pprint import pprint
&gt;&gt;&gt; pprint(result)
<span class="hl opt">[</span>'    <span class="hl num">1</span>. Beautiful is better than ugly.<span class="hl kwa">\n</span>',
 '-   <span class="hl num">2</span>. Explicit is better than implicit.<span class="hl kwa">\n</span>',
 '-   <span class="hl num">3</span>. Simple is better than complex.<span class="hl kwa">\n</span>',
 '+   <span class="hl num">3</span>.   Simple is better than complex.<span class="hl kwa">\n</span>',
 '?     ++                                <span class="hl kwa">\n</span>',
 '-   <span class="hl num">4</span>. Complex is better than complicated.<span class="hl kwa">\n</span>',
 '?            ^                     ---- ^  <span class="hl kwa">\n</span>',
 '+   <span class="hl num">4</span>. Complicated is better than complex.<span class="hl kwa">\n</span>',
 '?           ++++ ^                      ^  <span class="hl kwa">\n</span>',
 '+   <span class="hl num">5</span>. Flat is better than nested.<span class="hl kwa">\n</span>'<span class="hl opt">]</span>
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>

As a single multi-line string it looks like this:

<span class="hl kwa">\begin</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
&gt;&gt;&gt; import sys
&gt;&gt;&gt; sys.stdout.writelines(result)
    <span class="hl num">1</span>. Beautiful is better than ugly.
-   <span class="hl num">2</span>. Explicit is better than implicit.
-   <span class="hl num">3</span>. Simple is better than complex.
+   <span class="hl num">3</span>.   Simple is better than complex.
?     ++
-   <span class="hl num">4</span>. Complex is better than complicated.
?            ^                     ---- ^
+   <span class="hl num">4</span>. Complicated is better than complex.
?           ++++ ^                      ^
+   <span class="hl num">5</span>. Flat is better than nested.
<span class="hl kwa">\end</span><span class="hl opt">{</span>verbatim<span class="hl opt">}</span>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='http://git.zx2c4.com/cgit/about/'>cgit v0.12</a> at 2025-02-10 11:09:42 (GMT)</div>
</div> <!-- id=cgit -->
</body>
</html>
