Jim Mooney wrote: > dictnumfarkadoodle = listnumfarkadoodle = setnumfarkadoodle = 0 > # Since these are global I'm using words not likely to be duplicated > until I figure a different way and > # replace 'farkadoodle' with '' ;')
Name clashes are generally not a problem if (1) you keep module size manageable and (2) use descriptive names I'd suggest _dictname_index or _makeseq_dictname_index If you want to follow the generator approach you can use default arguments: >>> from itertools import count >>> def make_nextname(template): ... return map(template.format, count()).__next__ ... >>> f = make_nextname("farkadoodle{}") >>> f() 'farkadoodle0' >>> f() 'farkadoodle1' >>> f() 'farkadoodle2' >>> def make_seq(text, type, next_setname=make_nextname("set{}")): ... if type == set: ... print(next_setname(), "=", set(text.split())) ... else: ... raise ValueError("unsupported type") ... >>> make_seq("alpha beta gamma", set) set0 = {'alpha', 'beta', 'gamma'} >>> make_seq("alpha beta gamma", set) set1 = {'alpha', 'beta', 'gamma'} >>> make_seq("alpha beta gamma", set) set2 = {'alpha', 'beta', 'gamma'} Here's an alternative implementation of make_nextname() which may be easier to understand: >>> def make_nextname(template): ... counter = -1 ... def nextname(): ... nonlocal counter ... counter += 1 ... return template.format(counter) ... return nextname ... >>> f = make_nextname("foo{:03}") >>> f() 'foo000' >>> f() 'foo001' >>> f() 'foo002' This technique of nesting a function inside another function ("closure") can also be used on make_seq directly: def make_make_seq(): set_index = 0 ... def make_seq(text, type): nonlocal set_index if type == set: print("set%s" % set_index, "=", set(text.split())) set_index += 1 ... return make_seq make_seq = make_make_seq() make_seq("a b c", set) # set0 = {'c', 'b', 'a'} make_seq("a b c", set) # set1 = {'c', 'b', 'a'} _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor