[Tutor] global variables/constants versus volatile variables/constants

diliup gabadamudalige diliupg at gmail.com
Fri Jun 13 20:20:53 CEST 2014


pardon my ignorance. last few questions.

I declare the following dict at the beginning of the program.

KEY_SIGNATURES = {"C": [], "G": ["F"], "D": ["F", "C"], "A": ["F", "C",
"G"], "E": ["F", "C", "G", "D"], "B": ["F", "C", "G", "D", "A"], "F#":
["F", "C", "G", "D", "A", "E"], "C#": ["F", "C", "G", "D", "A", "E", "B"],
"F": ["B"], "Bb": ["B", "E"], "Eb": ["B", "E", "A"], "Ab": ["B", "E", "A",
"D"], "Db": ["B", "E", "A", "D", "G"], "Gb": ["B", "E", "A", "D", "G",
"C"], "Cb": ["B", "E", "A", "D", "G", "C", "F"], "Ahm": [], "Ehm": ["F"],
"Bhm": ["F", "C"], "F#hm": ["F", "C", "G"], "C#hm": ["F", "C", "G", "D"],
"G#hm": ["F", "C", "G", "D", "A"], "D#hm": ["F", "C", "G", "D", "A", "E"],
"A#hm": ["F", "C", "G", "D", "A", "E", "B"], "Dhm": ["B"], "Ghm": ["B",
"E"], "Chm": ["B", "E", "A"], "Fhm": ["B", "E", "A", "D"], "Bbhm": ["B",
"E", "A", "D", "G"], "Ebhm": ["B", "E", "A", "D", "G", "C"], "Abhm": ["B",
"E", "A", "D", "G", "C", "F"], "Amm": [], "Emm": ["F"], "Bmm": ["F", "C"],
"F#mm": ["F", "C", "G"], "C#mm": ["F", "C", "G", "D"], "G#mm": ["F", "C",
"G", "D", "A"], "D#mm": ["F", "C", "G", "D", "A", "E"], "A#mm": ["F", "C",
"G", "D", "A", "E", "B"], "Dmm": ["B"], "Gmm": ["B", "E"], "Cmm": ["B",
"E", "A"], "Fmm": ["B", "E", "A", "D"], "Bbmm": ["B", "E", "A", "D", "G"],
"Ebmm": ["B", "E", "A", "D", "G", "C"], "Abmm": ["B", "E", "A", "D", "G",
"C", "F"]}

now in the functions when ever I need to access i just use it.

eg:

sharps_or_flats = KEY_SIGNATURES[key]

or I can create it like this

class Variables():
def __init__(self, adv):
self.choice = choice  # level of advancement in questions
self.mousepos = (SCREENW / 2, SCREENH / 2)
self.SCREEN = pygame.display.get_surface()
                        self.KEY_SIGNATURES = {"C": [], "G": ["F"], "D":
["F", "C"], "A": ["F", "C", "G"], "E": ["F", "C", "G", "D"], "B": ["F",
"C", "G", "D", "A"], "F#": ["F", "C", "G", "D", "A", "E"], "C#": ["F", "C",
"G", "D", "A", "E", "B"], "F": ["B"], "Bb": ["B", "E"], "Eb": ["B", "E",
"A"], "Ab": ["B", "E", "A", "D"], "Db": ["B", "E", "A", "D", "G"], "Gb":
["B", "E", "A", "D", "G", "C"], "Cb": ["B", "E", "A", "D", "G", "C", "F"],
"Ahm": [], "Ehm": ["F"], "Bhm": ["F", "C"], "F#hm": ["F", "C", "G"],
"C#hm": ["F", "C", "G", "D"], "G#hm": ["F", "C", "G", "D", "A"], "D#hm":
["F", "C", "G", "D", "A", "E"], "A#hm": ["F", "C", "G", "D", "A", "E",
"B"], "Dhm": ["B"], "Ghm": ["B", "E"], "Chm": ["B", "E", "A"], "Fhm": ["B",
"E", "A", "D"], "Bbhm": ["B", "E", "A", "D", "G"], "Ebhm": ["B", "E", "A",
"D", "G", "C"], "Abhm": ["B", "E", "A", "D", "G", "C", "F"], "Amm": [],
"Emm": ["F"], "Bmm": ["F", "C"], "F#mm": ["F", "C", "G"], "C#mm": ["F",
"C", "G", "D"], "G#mm": ["F", "C", "G", "D", "A"], "D#mm": ["F", "C", "G",
"D", "A", "E"], "A#mm": ["F", "C", "G", "D", "A", "E", "B"], "Dmm": ["B"],
"Gmm": ["B", "E"], "Cmm": ["B", "E", "A"], "Fmm": ["B", "E", "A", "D"],
"Bbmm": ["B", "E", "A", "D", "G"], "Ebmm": ["B", "E", "A", "D", "G", "C"],
"Abmm": ["B", "E", "A", "D", "G", "C", "F"]}

now I call the class with

v=Variables()

now the same dict is
v.Key_SIGNATURES

sharps_or_flats = v.KEY_SIGNATURES[key]

my questions:
which is better to use and why?
Do both remain in memory(separately of course) till I exit the program once
I run it?
Will memory usage be the same?
will the creation of the dict take the same time in both above?





On Fri, Jun 13, 2014 at 10:44 PM, Albert-Jan Roskam <
fomcl at yahoo.com.dmarc.invalid> wrote:

>
>
> ----- Original Message -----
>
> > From: Steven D'Aprano <steve at pearwood.info>
> > To: tutor at python.org
> > Cc:
> > Sent: Friday, June 13, 2014 3:08 PM
> > Subject: Re: [Tutor] global variables/constants versus        volatile
>      variables/constants
> >
> > On Fri, Jun 13, 2014 at 05:10:28AM -0700, Albert-Jan Roskam wrote:
> >
> >>  The other day I used collections.namedtuple and I re-initialized
> >>  Record (see below) with every function*) call. Bad idea! It looks
> >>  nicer because I did not need a global (and globals are baaad, mkay?),
> >>  but it was *much* slower. I processed a log of a few million lines, I
> >>  think.
> >>
> >>  # bad --> time-consuming
> >>  import collections
> >>
> >>  def do_something_with(raw_record):
> >>     Record = collections.namedtuple("_", "
> > ".join("v%%03d" % i for i in range(100)))
> >>     return Record(*raw_record.split())
> >
> > Look at how much work you do here. First, you create a long string of
> > the form:
> >
> >     "v000 v001 v002 v003 ... v099"
> >
> > representing 1000 v-digits names. Then you create a brand new Record
> > class that takes those 100 v-digits names as arguments. Creating that
> > class requires building a string, parsing it as Python code, and then
> > running it. (You're not expected to know that, but if you read the
> > source code for namedtuple you will see that's how it works.) So
> > creating that class is slow. Every time you call the function, it builds
> > a new "v000 ... v099" string, from scratch, then builds a new class,
> > also from scratch, and finally populates an instance of that class with
> > 100 values from the raw_record.
> >
> > Only that last step needs to be done inside the function.
>
> Hmm, if I create the namedtuple with 'verbose=True' it *really* makes
> clear why it took so much longer.
> (what's '_property' btw? I know 'property' and the newer decorator wih the
> same name, but not _property).
>
> In [1]: import collections
>
> In [2]: Record = collections.namedtuple("_", " ".join("v%03d" % i for i in
> range(100)),verbose=True)
> class _(tuple):
>     '_(v000, v001, v002, v003, v004, v005, v006, v007, v008, v009, v010,
> v011, v012, v013, v014, v015, v016, v017, v018, v019, v020, v021, v022,
> v023, v024, v025, v026, v027, v028, v029, v030, v031, v032, v033, v034,
> v035, v036, v037, v038, v039, v040, v041, v042, v043, v044, v045, v046,
> v047, v048, v049, v050, v051, v052, v053, v054, v055, v056, v057, v058,
> v059, v060, v061, v062, v063, v064, v065, v066, v067, v068, v069, v070,
> v071, v072, v073, v074, v075, v076, v077, v078, v079, v080, v081, v082,
> v083, v084, v085, v086, v087, v088, v089, v090, v091, v092, v093, v094,
> v095, v096, v097, v098, v099)'
>
>     __slots__ = ()
>
>     _fields = ('v000', 'v001', 'v002', 'v003', 'v004', 'v005', 'v006',
> 'v007', 'v008', 'v009', 'v010', 'v011', 'v012', 'v013', 'v014', 'v015',
> 'v016', 'v017', 'v018', 'v019', 'v020', 'v021', 'v022', 'v023', 'v024',
> 'v025', 'v026', 'v027', 'v028', 'v029', 'v030', 'v031', 'v032', 'v033',
> 'v034', 'v035', 'v036', 'v037', 'v038', 'v039', 'v040', 'v041', 'v042',
> 'v043', 'v044', 'v045', 'v046', 'v047', 'v048', 'v049', 'v050', 'v051',
> 'v052', 'v053', 'v054', 'v055', 'v056', 'v057', 'v058', 'v059', 'v060',
> 'v061', 'v062', 'v063', 'v064', 'v065', 'v066', 'v067', 'v068', 'v069',
> 'v070', 'v071', 'v072', 'v073', 'v074', 'v075', 'v076', 'v077', 'v078',
> 'v079', 'v080', 'v081', 'v082', 'v083', 'v084', 'v085', 'v086', 'v087',
> 'v088', 'v089', 'v090', 'v091', 'v092', 'v093', 'v094', 'v095', 'v096',
> 'v097', 'v098', 'v099')
>
>     def __new__(_cls, v000, v001, v002, v003, v004, v005, v006, v007,
> v008, v009, v010, v011, v012, v013, v014, v015, v016, v017, v018, v019,
> v020, v021, v022, v023, v024, v025, v026, v027, v028, v029, v030, v031,
> v032, v033, v034, v035, v036, v037, v038, v039, v040, v041, v042, v043,
> v044, v045, v046, v047, v048, v049, v050, v051, v052, v053, v054, v055,
> v056, v057, v058, v059, v060, v061, v062, v063, v064, v065, v066, v067,
> v068, v069, v070, v071, v072, v073, v074, v075, v076, v077, v078, v079,
> v080, v081, v082, v083, v084, v085, v086, v087, v088, v089, v090, v091,
> v092, v093, v094, v095, v096, v097, v098, v099):
>         'Create new instance of _(v000, v001, v002, v003, v004, v005,
> v006, v007, v008, v009, v010, v011, v012, v013, v014, v015, v016, v017,
> v018, v019, v020, v021, v022, v023, v024, v025, v026, v027, v028, v029,
> v030, v031, v032, v033, v034, v035, v036, v037, v038, v039, v040, v041,
> v042, v043, v044, v045, v046, v047, v048, v049, v050, v051, v052, v053,
> v054, v055, v056, v057, v058, v059, v060, v061, v062, v063, v064, v065,
> v066, v067, v068, v069, v070, v071, v072, v073, v074, v075, v076, v077,
> v078, v079, v080, v081, v082, v083, v084, v085, v086, v087, v088, v089,
> v090, v091, v092, v093, v094, v095, v096, v097, v098, v099)'
>         return _tuple.__new__(_cls, (v000, v001, v002, v003, v004, v005,
> v006, v007, v008, v009, v010, v011, v012, v013, v014, v015, v016, v017,
> v018, v019, v020, v021, v022, v023, v024, v025, v026, v027, v028, v029,
> v030, v031, v032, v033, v034, v035, v036, v037, v038, v039, v040, v041,
> v042, v043, v044, v045, v046, v047, v048, v049, v050, v051, v052, v053,
> v054, v055, v056, v057, v058, v059, v060, v061, v062, v063, v064, v065,
> v066, v067, v068, v069, v070, v071, v072, v073, v074, v075, v076, v077,
> v078, v079, v080, v081, v082, v083, v084, v085, v086, v087, v088, v089,
> v090, v091, v092, v093, v094, v095, v096, v097, v098, v099))
>
>     @classmethod
>     def _make(cls, iterable, new=tuple.__new__, len=len):
>         'Make a new _ object from a sequence or iterable'
>         result = new(cls, iterable)
>         if len(result) != 100:
>             raise TypeError('Expected 100 arguments, got %d' % len(result))
>         return result
>
>     def __repr__(self):
>         'Return a nicely formatted representation string'
>         return '_(v000=%r, v001=%r, v002=%r, v003=%r, v004=%r, v005=%r,
> v006=%r, v007=%r, v008=%r, v009=%r, v010=%r, v011=%r, v012=%r, v013=%r,
> v014=%r, v015=%r, v016=%r, v017=%r, v018=%r, v019=%r, v020=%r, v021=%r,
> v022=%r, v023=%r, v024=%r, v025=%r, v026=%r, v027=%r, v028=%r, v029=%r,
> v030=%r, v031=%r, v032=%r, v033=%r, v034=%r, v035=%r, v036=%r, v037=%r,
> v038=%r, v039=%r, v040=%r, v041=%r, v042=%r, v043=%r, v044=%r, v045=%r,
> v046=%r, v047=%r, v048=%r, v049=%r, v050=%r, v051=%r, v052=%r, v053=%r,
> v054=%r, v055=%r, v056=%r, v057=%r, v058=%r, v059=%r, v060=%r, v061=%r,
> v062=%r, v063=%r, v064=%r, v065=%r, v066=%r, v067=%r, v068=%r, v069=%r,
> v070=%r, v071=%r, v072=%r, v073=%r, v074=%r, v075=%r, v076=%r, v077=%r,
> v078=%r, v079=%r, v080=%r, v081=%r, v082=%r, v083=%r, v084=%r, v085=%r,
> v086=%r, v087=%r, v088=%r, v089=%r, v090=%r, v091=%r, v092=%r, v093=%r,
> v094=%r, v095=%r, v096=%r, v097=%r, v098=%r, v099=%r)' % self
>
>     def _asdict(self):
>         'Return a new OrderedDict which maps field names to their values'
>         return OrderedDict(zip(self._fields, self))
>
>     __dict__ = property(_asdict)
>
>     def _replace(_self, **kwds):
>         'Return a new _ object replacing specified fields with new values'
>         result = _self._make(map(kwds.pop, ('v000', 'v001', 'v002',
> 'v003', 'v004', 'v005', 'v006', 'v007', 'v008', 'v009', 'v010', 'v011',
> 'v012', 'v013', 'v014', 'v015', 'v016', 'v017', 'v018', 'v019', 'v020',
> 'v021', 'v022', 'v023', 'v024', 'v025', 'v026', 'v027', 'v028', 'v029',
> 'v030', 'v031', 'v032', 'v033', 'v034', 'v035', 'v036', 'v037', 'v038',
> 'v039', 'v040', 'v041', 'v042', 'v043', 'v044', 'v045', 'v046', 'v047',
> 'v048', 'v049', 'v050', 'v051', 'v052', 'v053', 'v054', 'v055', 'v056',
> 'v057', 'v058', 'v059', 'v060', 'v061', 'v062', 'v063', 'v064', 'v065',
> 'v066', 'v067', 'v068', 'v069', 'v070', 'v071', 'v072', 'v073', 'v074',
> 'v075', 'v076', 'v077', 'v078', 'v079', 'v080', 'v081', 'v082', 'v083',
> 'v084', 'v085', 'v086', 'v087', 'v088', 'v089', 'v090', 'v091', 'v092',
> 'v093', 'v094', 'v095', 'v096', 'v097', 'v098', 'v099'), _self))
>         if kwds:
>             raise ValueError('Got unexpected field names: %r' %
> kwds.keys())
>         return result
>
>     def __getnewargs__(self):
>         'Return self as a plain tuple.  Used by copy and pickle.'
>         return tuple(self)
>
>     v000 = _property(_itemgetter(0), doc='Alias for field number 0')
>
>     v001 = _property(_itemgetter(1), doc='Alias for field number 1')
>
>     v002 = _property(_itemgetter(2), doc='Alias for field number 2')
>
>     v003 = _property(_itemgetter(3), doc='Alias for field number 3')
>
>     v004 = _property(_itemgetter(4), doc='Alias for field number 4')
>
>     v005 = _property(_itemgetter(5), doc='Alias for field number 5')
>
>     v006 = _property(_itemgetter(6), doc='Alias for field number 6')
>
>     v007 = _property(_itemgetter(7), doc='Alias for field number 7')
>
>     v008 = _property(_itemgetter(8), doc='Alias for field number 8')
>
>     v009 = _property(_itemgetter(9), doc='Alias for field number 9')
>
>     v010 = _property(_itemgetter(10), doc='Alias for field number 10')
>
>     v011 = _property(_itemgetter(11), doc='Alias for field number 11')
>
>     v012 = _property(_itemgetter(12), doc='Alias for field number 12')
>
>     v013 = _property(_itemgetter(13), doc='Alias for field number 13')
>
>     v014 = _property(_itemgetter(14), doc='Alias for field number 14')
>
>     v015 = _property(_itemgetter(15), doc='Alias for field number 15')
>
>     v016 = _property(_itemgetter(16), doc='Alias for field number 16')
>
>     v017 = _property(_itemgetter(17), doc='Alias for field number 17')
>
>     v018 = _property(_itemgetter(18), doc='Alias for field number 18')
>
>     v019 = _property(_itemgetter(19), doc='Alias for field number 19')
>
>     v020 = _property(_itemgetter(20), doc='Alias for field number 20')
>
>     v021 = _property(_itemgetter(21), doc='Alias for field number 21')
>
>     v022 = _property(_itemgetter(22), doc='Alias for field number 22')
>
>     v023 = _property(_itemgetter(23), doc='Alias for field number 23')
>
>     v024 = _property(_itemgetter(24), doc='Alias for field number 24')
>
>     v025 = _property(_itemgetter(25), doc='Alias for field number 25')
>
>     v026 = _property(_itemgetter(26), doc='Alias for field number 26')
>
>     v027 = _property(_itemgetter(27), doc='Alias for field number 27')
>
>     v028 = _property(_itemgetter(28), doc='Alias for field number 28')
>
>     v029 = _property(_itemgetter(29), doc='Alias for field number 29')
>
>     v030 = _property(_itemgetter(30), doc='Alias for field number 30')
>
>     v031 = _property(_itemgetter(31), doc='Alias for field number 31')
>
>     v032 = _property(_itemgetter(32), doc='Alias for field number 32')
>
>     v033 = _property(_itemgetter(33), doc='Alias for field number 33')
>
>     v034 = _property(_itemgetter(34), doc='Alias for field number 34')
>
>     v035 = _property(_itemgetter(35), doc='Alias for field number 35')
>
>     v036 = _property(_itemgetter(36), doc='Alias for field number 36')
>
>     v037 = _property(_itemgetter(37), doc='Alias for field number 37')
>
>     v038 = _property(_itemgetter(38), doc='Alias for field number 38')
>
>     v039 = _property(_itemgetter(39), doc='Alias for field number 39')
>
>     v040 = _property(_itemgetter(40), doc='Alias for field number 40')
>
>     v041 = _property(_itemgetter(41), doc='Alias for field number 41')
>
>     v042 = _property(_itemgetter(42), doc='Alias for field number 42')
>
>     v043 = _property(_itemgetter(43), doc='Alias for field number 43')
>
>     v044 = _property(_itemgetter(44), doc='Alias for field number 44')
>
>     v045 = _property(_itemgetter(45), doc='Alias for field number 45')
>
>     v046 = _property(_itemgetter(46), doc='Alias for field number 46')
>
>     v047 = _property(_itemgetter(47), doc='Alias for field number 47')
>
>     v048 = _property(_itemgetter(48), doc='Alias for field number 48')
>
>     v049 = _property(_itemgetter(49), doc='Alias for field number 49')
>
>     v050 = _property(_itemgetter(50), doc='Alias for field number 50')
>
>     v051 = _property(_itemgetter(51), doc='Alias for field number 51')
>
>     v052 = _property(_itemgetter(52), doc='Alias for field number 52')
>
>     v053 = _property(_itemgetter(53), doc='Alias for field number 53')
>
>     v054 = _property(_itemgetter(54), doc='Alias for field number 54')
>
>     v055 = _property(_itemgetter(55), doc='Alias for field number 55')
>
>     v056 = _property(_itemgetter(56), doc='Alias for field number 56')
>
>     v057 = _property(_itemgetter(57), doc='Alias for field number 57')
>
>     v058 = _property(_itemgetter(58), doc='Alias for field number 58')
>
>     v059 = _property(_itemgetter(59), doc='Alias for field number 59')
>
>     v060 = _property(_itemgetter(60), doc='Alias for field number 60')
>
>     v061 = _property(_itemgetter(61), doc='Alias for field number 61')
>
>     v062 = _property(_itemgetter(62), doc='Alias for field number 62')
>
>     v063 = _property(_itemgetter(63), doc='Alias for field number 63')
>
>     v064 = _property(_itemgetter(64), doc='Alias for field number 64')
>
>     v065 = _property(_itemgetter(65), doc='Alias for field number 65')
>
>     v066 = _property(_itemgetter(66), doc='Alias for field number 66')
>
>     v067 = _property(_itemgetter(67), doc='Alias for field number 67')
>
>     v068 = _property(_itemgetter(68), doc='Alias for field number 68')
>
>     v069 = _property(_itemgetter(69), doc='Alias for field number 69')
>
>     v070 = _property(_itemgetter(70), doc='Alias for field number 70')
>
>     v071 = _property(_itemgetter(71), doc='Alias for field number 71')
>
>     v072 = _property(_itemgetter(72), doc='Alias for field number 72')
>
>     v073 = _property(_itemgetter(73), doc='Alias for field number 73')
>
>     v074 = _property(_itemgetter(74), doc='Alias for field number 74')
>
>     v075 = _property(_itemgetter(75), doc='Alias for field number 75')
>
>     v076 = _property(_itemgetter(76), doc='Alias for field number 76')
>
>     v077 = _property(_itemgetter(77), doc='Alias for field number 77')
>
>     v078 = _property(_itemgetter(78), doc='Alias for field number 78')
>
>     v079 = _property(_itemgetter(79), doc='Alias for field number 79')
>
>     v080 = _property(_itemgetter(80), doc='Alias for field number 80')
>
>     v081 = _property(_itemgetter(81), doc='Alias for field number 81')
>
>     v082 = _property(_itemgetter(82), doc='Alias for field number 82')
>
>     v083 = _property(_itemgetter(83), doc='Alias for field number 83')
>
>     v084 = _property(_itemgetter(84), doc='Alias for field number 84')
>
>     v085 = _property(_itemgetter(85), doc='Alias for field number 85')
>
>     v086 = _property(_itemgetter(86), doc='Alias for field number 86')
>
>     v087 = _property(_itemgetter(87), doc='Alias for field number 87')
>
>     v088 = _property(_itemgetter(88), doc='Alias for field number 88')
>
>     v089 = _property(_itemgetter(89), doc='Alias for field number 89')
>
>     v090 = _property(_itemgetter(90), doc='Alias for field number 90')
>
>     v091 = _property(_itemgetter(91), doc='Alias for field number 91')
>
>     v092 = _property(_itemgetter(92), doc='Alias for field number 92')
>
>     v093 = _property(_itemgetter(93), doc='Alias for field number 93')
>
>     v094 = _property(_itemgetter(94), doc='Alias for field number 94')
>
>     v095 = _property(_itemgetter(95), doc='Alias for field number 95')
>
>     v096 = _property(_itemgetter(96), doc='Alias for field number 96')
>
>     v097 = _property(_itemgetter(97), doc='Alias for field number 97')
>
>     v098 = _property(_itemgetter(98), doc='Alias for field number 98')
>
>     v099 = _property(_itemgetter(99), doc='Alias for field number 99')
>
>
>
> <snip>
>
>
> > Global variables aren't bad because Moses came down from the mountains
> > with a stone tablet that declares that they are bad. They're bad because
> > they cause excessive coupling, they operate by side-effect, they spoil
> > idepotent code, and they are implicit instead of explicit.
>
>
> LOL :-) Textbooks conditioned me to have a generalized fear of globals.
> Like Little Albert: http://en.wikipedia.org/wiki/Little_Albert_experiment
> :-)
>
>
>
>
> >>  def do_something_with(raw_record):
> >>     return Record(*raw_record.split())
> >
> > Much more sensible!
> >
> >
> >
> >
> > --
> > Steven
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>



-- 
Diliup Gabadamudalige

http://www.diliupg.com
http://soft.diliupg.com/

**********************************************************************************************
This e-mail is confidential. It may also be legally privileged. If you are
not the intended recipient or have received it in error, please delete it
and all copies from your system and notify the sender immediately by return
e-mail. Any unauthorized reading, reproducing, printing or further
dissemination of this e-mail or its contents is strictly prohibited and may
be unlawful. Internet communications cannot be guaranteed to be timely,
secure, error or virus-free. The sender does not accept liability for any
errors or omissions.
**********************************************************************************************
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20140613/f2786fb3/attachment-0001.html>


More information about the Tutor mailing list