#!/usr/bin/env python ## ## Author: Bruce Hill ## Email: brucehill@sbcglobal.net ## def idle_question(): """ Reveals questionable results from idle, Windows, & several built-in functions. Under idle: function swapcase() updates 120 different characters. Under Windows (dos-screen) or under a Windows ide (PyScripter) swapcase() updates only 52 characters which correspond to ord values 65-90 for (uppercase)A-Z and 97-122 for (lowercase)a-z. Under idle: functions lower() & upper() return different results than swapcase() for hex values: 8a, 8c, 8e, 9a, 9c, 9e, 9f, ff ord values 138, 140, 142, 154, 156, 158, 159, 255 """ tab,nl = '\t','\n' oldhexes,oldchars,newchars,newhexes,handled_wrong = [],[],[],[],[] clist = [chr(x) for x in xrange(256)] cstring = ''.join(clist) hstring = cstring.encode('hex') hlist = [hstring[n:n+2] for n in xrange(0,len(hstring),2)] c2h = dict(zip(clist,hlist)) new = cstring.swapcase() for n in xrange(len(cstring)): oldchar,newchar = cstring[n:n+1],new[n:n+1] """ find every character processed by function swapcase() """ if newchar != oldchar: oldhexes.append(`c2h[oldchar]`) oldchars.append(oldchar) newchars.append(newchar) newhexes.append(`c2h[newchar]`) line = ' '.join(['oldord # (',`n`,')',tab,\ oldhexes[-1],oldchar,'---',newchar,newhexes[-1],tab,\ 'neword # (',`ord(newchar)`,')']) char = oldchar.lower() if char == oldchar: char = oldchar.upper() """ find characters handled wrong by functions lower() or upper() """ if ord(char) != ord(newchar): wrong_result = `ord(char)` handled_wrong.append(ord(oldchar)) else: wrong_result = '' line = tab.join([line,oldchar,char,wrong_result]) print line.expandtabs(4) print nl,len(newchars),'of 120 eligible characters were processed by function swapcase()' if len(handled_wrong) > 0: print len(handled_wrong),'characters where lower() or upper()',\ 'results differ from swapcase()' print 'oldord:',handled_wrong """ format print results in columns""" i2h = dict(zip(range(len(hlist)),hlist)) hexs = [i2h[i] for i in handled_wrong] hline = tab.join(hexs) print '...hex: ',hline.expandtabs(5) chars = map(chr,handled_wrong) cline = tab.join(chars) print '...char: ',cline.expandtabs(5) print ' ' if len(newchars) != 120: xit = raw_input('press ') if __name__ == "__main__": idle_question()