Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When does using swapcase twice not return an identical answer?

Tags:

python

The Python docs for str.swapcase() say:

Note that it is not necessarily true that s.swapcase().swapcase() == s.

I'm guessing that this has something to do with Unicode; however, I wasn't able to produce a string that changed after exactly two applications of swapcase(). What kind of a string would fail to produce an identical result?

Here's what I tested (acquired here):

>>> testString = '''Bãcoл ípѕüϻ Ꮷ߀ɭor sìt ämét qûìs àɭïɋüíp cülρä, ϻagnâ èх ѕêԁ ѕtríρ stêãk iл ԁò ut sålámí éхèrcìtátïoл pòrƙ ɭ߀in. Téԉԁërɭ߀ín tùrkèϒ ѕáûsáɢè лùɭɭå pɑrïátûr, ƃáll típ âԁiρïѕicïԉǥ ɑᏧ c߀ԉsêquät ϻâgлã véлïsoл. Míлím àutë ѵ߀ɭüρtåte mòɭɭít tri-tíρ dèsêrùԉt. Occãècát vëԉis߀ԉ êХ eiùѕm߀d séᏧ láborüϻ pòrƙ lòïл àliɋûå ìлcíԁìԁúԉt. Sed còmϻ߀Ꮷ߀ յoɰl offícíä pòrƙ ƅèɭly témρòr lâƅòrùϻ tâiɭ sρårê ríbs toлǥue ϻêátɭòáf måɢnä.  Kièɭbàѕã in còлѕêctêtur ѵëлíàϻ pâríɑtùr p߀rk ɭ߀in êxêrcìtâtiòл älìɋúíρ câρicolɑ ρork tòлɢüê düis ԁ߀ɭoré rêpréhéԉᏧérït. Tènԁèrloiԉ ëх rèρréհeԉԁérït fûgíãt ädipìsiciԉg gr߀ünᏧ roúлd, ƅaɭɭ típ հàϻƃûrǥèr ѕɦòùlder ɭåb߀rûϻ têmρor ríƃêyë. Eѕsè hàϻ ѵëԉiam, åɭíɋùɑ ìrüre ρòrƙ cɦop ԁò ԁ߀ɭoré frânkfürter nülla påsträϻí sàusàgè sèᏧ. Eӽcêptêür ѕëd t-b߀лë հɑϻ, esѕë ut ɭàƅoríѕ ƃáll tíρ nostrúԁ sհ߀üldêr ïn shòrt ríƅs ρástrámï. Essé hamƅûrǥër ɭäƅòré, fatƃàcƙ teԉderlòïn sհ߀rt rïbs ρròìdént riƅêye ɭab߀rum. Nullɑ türԁùcƙèn л߀n, sρarè rìƅs eӽceρteur ádïρìѕìcïԉǥ êt ѕɦort ɭòin dolorë änïm dêѕêrùлt. Sհäлƙlè cúpïԁätát pork lòïn méåtbäll, ԉ߀strud réprèհéԉԁêrìt ɦɑϻburǥêr ѕâɭɑϻí Ꮷol߀rè ɑd lêberƙãs.  Boûdiл toлǥuê c߀ԉsèqûåt eà rümρ ƅálɭ tíρ ѕρâré rìbѕ ín pròiᏧent dûiѕ ϻíлïm èíuѕmòᏧ c߀rԉêᏧ ƃèèf ƅɑc߀л d߀lorè. Cornèd ƅëèf drûmsticƙ cùlpa, éлïm baɭɭ tìp ϻéatbâlɭ lab߀rê tri-tïp vënisoԉ ǥroùԉԁ ròùлԁ հɑm iл èä bãcòn. Eѕѕé ìᏧ ѕúԉt, sհoùldér ƙïeɭƃäѕà ãԁiρisïcïԉɢ ɦaϻbûrgêr út ԁòɭ߀re fåtbäcƙ ԁ߀ɭòr äлïm trï-típ. EíùsϻòᏧ nülɭã läbòruϻ лíѕi êxcéptèúr. Occåécåt Ꮷüíѕ ԁèserüлt toԉǥue ϳ߀wɭ. Rèρréɦëԉԁêrit áɭïqúíp fûǥiàt tùrkey véniãϻ qüìѕ.''' >>> testString.swapcase().swapcase() == testString True 
like image 489
sushain97 Avatar asked Dec 20 '13 05:12

sushain97


1 Answers

This is the case when multiple letters are lower cases of the same letter.

For example, the micro character µ (U+00B5) and the mu character μ (U+03BC):

>>> u'\xb5'.swapcase() u'\u039c' >>> u'\u03bc'.swapcase() u'\u039c' 

The two are different characters, but their uppercase counterparts are the same. This means that when str.swapcase() is applied, they return the same character. However, doing this again can't (and won't) return both letters.

>>> u'\xb5'.swapcase().swapcase() u'\u03bc' 
like image 153
Volatility Avatar answered Sep 19 '22 06:09

Volatility