Re: [Tutor] “has a value of True” versus “evaluates true”

2014-11-13 Thread Steven D'Aprano
On Thu, Nov 13, 2014 at 12:16:19PM -0800, Danny Yoo wrote:
> > Unlike some languages, which choose confusing and arbitrary sets of
> > values that count as truthy or falsey, Python encourages a simple
> > distinction, something versus nothing. Values which represent some kind
> > of "nothing" are falsey:
> 
> 
> Hi Steven,
> 
> Sure.  I'm not arguing that Python's choices of what's truthy or
> falsey isn't consistent or hard to remember.  What I'm saying is that
> I personally have to deal with multiple languages at once these days.
> (JavaScript is the big one.)  I find one of the points where things
> seem needlessly divergent is truthiness.  Given that, I personally
> subset the language so that I don't have to spend brainpower on this
> issue.

*shrug*

Any time you use multiple languages, you have to deal with their 
differences in syntax and semantics. That's the cost of using multiple 
languages. I'm sympathetic to that fact, but I'm not sympathetic to the 
suggestion that we should avoid a sensible and useful language feature 
because *other* languages do things differently.

Deliberately forgoing the use of a language feature because you have 
trouble with it is understandable. You know your own strengths and 
weaknesses, and if that helps you avoid bugs that's a good thing. But 
the cost is that you may be writing unidiomatic code, or code that works 
but can be improved.

If I couldn't remember the difference between [1, 2] and (1, 2), and 
consequently wrote list([1, 2]) "just to be sure", we'd all agree that 
it was poor coding style even if we sympathised with my confusion over 
lists and tuple.


> As a confession: I have run and introduced bugs where the root cause
> was one language's truthiness table diverging from another.  Given
> that I recognise that I make this particular class of mistake a bit
> more frequently than I'd like, I try to account for this personal
> weakness and engineer for it.  I am not clever.

I think you're a lot cleverer than you give yourself credit for, and 
your coping strategy is a matter for you and anyone reviewing your code. 
Criticising people's code can often be mistaken for criticising the 
person themselves, but it shouldn't be seen that way. 


> >> To quote: "Let your statement be: 'Yes, yes', or "no, no': anything beyond
> >> these is of evil."
> >
> > "Have you stopped abusing small children yet?"
> 
> :(
> 
> I don't understand what your response here means.

"Yes" means that the answerer previously abused children; "No" means 
that haven't stopped. If the answerer never abused children at all, the 
question is a trap and neither Yes nor No is an accurate, truthful 
answer. Matthew's instruction that an accurate answer that explains the 
facts correctly ("I have never abused children at all") is to be 
considered "evil" is itself wicked, or at least terribly naive.


> My intent in
> quoting Matthew 5:37 was purely as a joke, precisely because the quote
> is so ridiculously out of context and definitely not intended to apply
> to the boolean context of programming languages.  My apologies if you
> didn't like that.

Your quote was intended to be humourous, as was my reply. I certainly 
wasn't implying that you have abused children.


-- 
Steve
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true”

2014-11-13 Thread Marc Tompkins
On Thu, Nov 13, 2014 at 12:40 PM, Ben Finney 
wrote:

> Danny Yoo  writes:
>
> > >> To quote: "Let your statement be: 'Yes, yes', or "no, no': anything
> > >> beyond these is of evil."
> > >
> > > "Have you stopped abusing small children yet?"
> >
> > :(
> >
> > I don't understand what your response here means.
>
> He's pointing out that many questions that ask a yes-or-no question
> can't actually be truthfully answered “yes, yes”, nor “no, no”.
>
> It seems you demonstrated his point quite well :-)
>

The classic version, of course, is "Have you stopped beating your wife?
"
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true”

2014-11-13 Thread Ben Finney
Danny Yoo  writes:

> >> To quote: "Let your statement be: 'Yes, yes', or "no, no': anything
> >> beyond these is of evil."
> >
> > "Have you stopped abusing small children yet?"
>
> :(
>
> I don't understand what your response here means.

He's pointing out that many questions that ask a yes-or-no question
can't actually be truthfully answered “yes, yes”, nor “no, no”.

It seems you demonstrated his point quite well :-)

-- 
 \   “Some people have a problem, and they think “I know, I'll use |
  `\ Perl!”. Now they have some number of problems but they're not |
_o__) sure whether it's a string or an integer.” —Benno Rice, 2011 |
Ben Finney

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true”

2014-11-13 Thread Danny Yoo
> Unlike some languages, which choose confusing and arbitrary sets of
> values that count as truthy or falsey, Python encourages a simple
> distinction, something versus nothing. Values which represent some kind
> of "nothing" are falsey:


Hi Steven,

Sure.  I'm not arguing that Python's choices of what's truthy or
falsey isn't consistent or hard to remember.  What I'm saying is that
I personally have to deal with multiple languages at once these days.
(JavaScript is the big one.)  I find one of the points where things
seem needlessly divergent is truthiness.  Given that, I personally
subset the language so that I don't have to spend brainpower on this
issue.

As a confession: I have run and introduced bugs where the root cause
was one language's truthiness table diverging from another.  Given
that I recognise that I make this particular class of mistake a bit
more frequently than I'd like, I try to account for this personal
weakness and engineer for it.  I am not clever.


>> To quote: "Let your statement be: 'Yes, yes', or "no, no': anything beyond
>> these is of evil."
>
> "Have you stopped abusing small children yet?"

:(

I don't understand what your response here means.  My intent in
quoting Matthew 5:37 was purely as a joke, precisely because the quote
is so ridiculously out of context and definitely not intended to apply
to the boolean context of programming languages.  My apologies if you
didn't like that.
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true”

2014-11-12 Thread Steven D'Aprano
On Wed, Nov 12, 2014 at 01:25:15AM +, Danny Yoo wrote:

> Just to note; not all programming languages do it this way.  Python is
> fairly permissive in what it allows to be "truthy".  See:
> https://plus.google.com/+ShriramKrishnamurthi/posts/4qvvKYC1R8Y for a brief
> survey of what many other programming languages do.
> 
> It can be confusing and bug-prone as heck.

I strongly disagree, especially since Python has an excellent model for 
deciding truthiness by default: something versus nothing.

Python's treatment of true/false values matches the standard Python 
philosophy of duck-typing. Rather than require a fixed type of object, 
say a duck, Python generally allows you to use anything which behaves 
sufficiently duck-like for your purposes. All Python objects quack like 
bools, and truthiness is a fundamental property of all Python objects.

Unlike some languages, which choose confusing and arbitrary sets of 
values that count as truthy or falsey, Python encourages a simple 
distinction, something versus nothing. Values which represent some kind 
of "nothing" are falsey:

- numeric zeroes, e.g. 0, 0.0, 0j, Decimal(0)
- empty containers, e.g. [], (), {}, set(), frozenset()
- empty strings, e.g. "", u""
- None

Values with represent something are truthy:

- non-zero numbers
- non-empty containers
- non-empty strings
- arbitrary objects


 
> For myself, I usually want as restrictive an approach as possible with
> respect to what things are considered "truthy".  If I'm in a boolean
> context, I will explicitly make the expression being tested be either True
> or False, and that's it.

Do you duck-type other kinds of values, or do you insist on explicitly 
forcing everything to be a single kind of object?

Do you write "len(list(sequence))", or just "len(sequence)"?

If you allow len() to duck-type its argument, why not allow duck-typing 
bools?


> That way, I know I won't get into shaky waters.
> I program in multiple languages: I don't want to spend brain power
> remembering yet another a truth table about truth.

It's your choice to program in multiple languages. Presumably you get 
some benefit from that. The cost of using different languages is that 
they are different: they have different semantics, syntax, libraries, 
they use different idioms, require you to write different code. If you 
don't like that, don't write code in different languages.

Do you complain that it is "confusing and bug-prone as heck" that the 
same operation might be spelled any of these ways?

len(x)
laenge(x)
length(x)
x.len()
x.len
size(x)
sizeof(x)
x len
len x
x:length()


All languages makes choices. Complaining that a specific choice is hard 
to use, inconsistent with the rest of the language, confusing or 
bug-prone is okay. Complaining that different languages have different 
semantics is, well, silly. Different programming languages are 
different, that's why they're different languages and not all FORTRAN.

Anyone who writes:

if bool(x): ...

in Python instead of just "if x" is just exposing their own confusion. 
Think about it: calling bool() explicitly does *nothing* that Python 
doesn't already do, that's as silly as writing:

result = int(23) + float(42.5)

If they write this:

if bool(x) == True: 

that's even more foolish. Why stop there?

if bool(x) == True == True: 
if bool(x) == True == True == True: 
if bool(x) == True == True == True == True:
# I never know where to stop...


It may be acceptable to specifically accept *only* True and False under 
some (hopefully rare) circumstances:

if x is True: ...
elif x is False: ...
else: raise TypeError

but if you insist in trying to force Python to be a poor emulation of 
Pascal, one wonders why you don't just use Pascal.


> To quote: "Let your statement be: 'Yes, yes', or "no, no': anything beyond
> these is of evil."

"Have you stopped abusing small children yet?"



-- 
Steven
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true” (was: don't understand iteration)

2014-11-12 Thread Steven D'Aprano
On Tue, Nov 11, 2014 at 10:24:00AM +1100, Ben Finney wrote:
> "Clayton Kirkwood"  writes:
> 
> > Also of confusion, the library reference says:
> >
> > Match objects always have a boolean value of True. Since match() and
> > search() return None when there is no match, you can test whether there was
> > a match with a simple if statement:
> >
> > match = re.search(pattern, string)
> > if match:
> > process(match)
> 
> The documentation is incorrect, as you point out: “have a boolean value
> of True” implies that the value is identical to the built-in ‘True’
> constant, which is never the case for these objects.

I disagree with that interpretation. "X has a boolean value of 
True" does not imply that X is necessarily True, but only that bool(X) is 
True. Is the same way we might say:

Lists have a string representation with [ and ] delimiters 
and , item separators

I trust that you wouldn't interprete that as meaning that lists *are* 
strings.

If the documentation said that match objects *are* the boolean value 
True, then you would be correct, but it doesn't. Your interpretation 
confuses "has" for "is".

To put it another way, "X has a boolean value of True" is synonymous 
with any of these alternative ways of saying the same thing:

"X evaluates like True in a boolean context"

"X is truthy"

"X is a truthy value"

"X is a true-like value"

"X is equivalent to the bool True in boolean contexts"

"X has the quality of being interpreted as true in boolean contexts"

"bool(X) returns True"

and many other ways of saying the same thing.



> Instead, the passage above should say “evaluates true in a boolean
> context”.
> 
> Would you be so kind as to report a bug to that effect
> http://bugs.python.org/>?

I shouldn't bother if I were you :-)



-- 
Steven
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true”

2014-11-11 Thread Clayton Kirkwood
 

 

From: Tutor [mailto:tutor-bounces+crk=godblessthe...@python.org] On Behalf Of 
Danny Yoo
Sent: Tuesday, November 11, 2014 5:25 PM
To: Ben Finney; tutor@python.org
Subject: Re: [Tutor] “has a value of True” versus “evaluates true”

 

 

On Tue Nov 11 2014 at 3:09:38 PM Ben Finney mailto:ben%2bpyt...@benfinney.id.au> > wrote:

"Clayton Kirkwood"  writes:

> So, there is a difference between None and False, is that the issue?

Yes. Those two values are different and not equal; but both evaluate
false in a boolean context.

 

 

Just to note; not all programming languages do it this way.  Python is fairly 
permissive in what it allows to be "truthy".  See: 
https://plus.google.com/+ShriramKrishnamurthi/posts/4qvvKYC1R8Y for a brief 
survey of what many other programming languages do.

 

It can be confusing and bug-prone as heck.

 

For myself, I usually want as restrictive an approach as possible with respect 
to what things are considered "truthy".  If I'm in a boolean context, I will 
explicitly make the expression being tested be either True or False, and that's 
it.  That way, I know I won't get into shaky waters.  I program in multiple 
languages: I don't want to spend brain power remembering yet another a truth 
table about truth.

 

Thanks, Danny, that’s kind of the thing I learned about this whole issue. Force 
the issue truth by casting. Don’t know if I’ll always keep it, but that seems 
prudent. What led to a portion of this whole issue was that I was assuming that 
equal sign assignment would produce a True/False certainty which could be 
tested. I vaguely recall this premise in another language, probably C or Perl.

 

Truthfully,

 

Clayton

 

To quote: "Let your statement be: 'Yes, yes', or "no, no': anything beyond 
these is of evil."

 

:P

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true”

2014-11-11 Thread Danny Yoo
On Tue Nov 11 2014 at 3:09:38 PM Ben Finney 
wrote:

> "Clayton Kirkwood"  writes:
>
> > So, there is a difference between None and False, is that the issue?
>
> Yes. Those two values are different and not equal; but both evaluate
> false in a boolean context.
>
>

Just to note; not all programming languages do it this way.  Python is
fairly permissive in what it allows to be "truthy".  See:
https://plus.google.com/+ShriramKrishnamurthi/posts/4qvvKYC1R8Y for a brief
survey of what many other programming languages do.

It can be confusing and bug-prone as heck.

For myself, I usually want as restrictive an approach as possible with
respect to what things are considered "truthy".  If I'm in a boolean
context, I will explicitly make the expression being tested be either True
or False, and that's it.  That way, I know I won't get into shaky waters.
I program in multiple languages: I don't want to spend brain power
remembering yet another a truth table about truth.

To quote: "Let your statement be: 'Yes, yes', or "no, no': anything beyond
these is of evil."

:P
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true”

2014-11-11 Thread Ben Finney
"Clayton Kirkwood"  writes:

> So, there is a difference between None and False, is that the issue?

Yes. Those two values are different and not equal; but both evaluate
false in a boolean context.

> I don’t necessarily see the difference as stated in the subject line.

The difference is: there is exactly one ‘True’ value, but many values
which *evaluate* true in a boolean context.

That is, many values (any non-empty string, any non-zero number, any
non-empty collection, most values of most types) are not equal to
‘True’; but will evaluate true when used in an ‘if’ or ‘while’ or other
boolean context.

So, the documentation stating “X has a value of True” leads to the
incorrect inference you drew, of expecting it to *compare equal to* True
(and, indeed, to be *identical to* True).

Whereas what the documentation needs to say is that the objects it is
referring to have values which *evaluate true* in a boolean context such
as ‘if’ or ‘while’. No implications about values being equal to other
values.

-- 
 \ “I went to the cinema, it said ‘Adults: $5.00, Children $2.50’. |
  `\  So I said ‘Give me two boys and a girl.’” —Steven Wright |
_o__)  |
Ben Finney

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true”

2014-11-11 Thread Alan Gauld

On 11/11/14 20:04, Clayton Kirkwood wrote:

So, there is a difference between None and False, is that the issue?


Yes. True and False are the only literal boolean values.
Everything else is boolean-like. That is, they can be used
in a boolean context and Python will treat them as if
they were either True or False, but they are not identical
to the literal values True and False.

So if you use None as a boolean expression in an if test it will be 
treated like it was False. But if you compare it to literal False

using '==' or 'is' it will not be the same.

You can see that below:

>>> if not None: print('Its true')
...
Its true
>>> if not False: print('Its true')
...
Its true

So those two worked identically

>>> if None == False: print('Its not true')
...
>>> if None is False: print('Its not true')
...

But None is not the same as False since neither print() was called.

>>> if bool(None) == False: print('Its true this time')
...
Its true this time
>>>

But if we explicitly convert None to a boolean value it is False.

--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.flickr.com/photos/alangauldphotos

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true” (was: don't understand iteration)

2014-11-11 Thread Clayton Kirkwood
So, there is a difference between None and False, is that the issue? I don’t 
necessarily see the difference as stated in the subject line. 

A=True

If  A == True

If A

 

Is this the crux of the issue?

 

BTW, the feedback to my submittal suggests that this is a difference with no 
distinction.

 

Clayton

 

From: wesley chun [mailto:wes...@gmail.com] 
Sent: Monday, November 10, 2014 11:35 PM
To: c...@godblessthe.us
Cc: Ben Finney; tutor
Subject: Re: [Tutor] “has a value of True” versus “evaluates true” (was: don't 
understand iteration)

 

good catch, and definitely a distinction beginners should be more cognizant of.

it's also good to recognize that a call to "bool(match)" would render that 
statement correct, as the built-in/factory function will return what an object 
evaluates to (True [re.match object] or/vs.False [None]).

 

On Mon, Nov 10, 2014 at 5:31 PM, Clayton Kirkwood  wrote:

I reported it. I feel all grown up now. Kind of like one of the boys(girls...)

Clayton:<)



>-Original Message-
>From: Tutor [mailto:tutor-bounces+crk <mailto:tutor-bounces%2Bcrk> 
>=godblessthe...@python.org] On
>Behalf Of Ben Finney
>Sent: Monday, November 10, 2014 3:24 PM
>To: tutor@python.org
>Subject: [Tutor] “has a value of True” versus “evaluates true” (was:
>don't understand iteration)
>
>"Clayton Kirkwood"  writes:
>
>> Also of confusion, the library reference says:
>>
>> Match objects always have a boolean value of True. Since match() and
>> search() return None when there is no match, you can test whether
>> there was a match with a simple if statement:
>>
>> match = re.search(pattern, string)
>> if match:
>> process(match)
>
>The documentation is incorrect, as you point out: “have a boolean value
>of True” implies that the value is identical to the built-in ‘True’
>constant, which is never the case for these objects.
>
>Instead, the passage above should say “evaluates true in a boolean
>context”.
>
>Would you be so kind as to report a bug to that effect
>http://bugs.python.org/>?
>
>--
> \   “The Vatican is not a state.… a state must have people. There |
>  `\are no Vaticanians.… No-one gets born in the Vatican except by |
>_o__)an unfortunate accident.” —Geoffrey Robertson, 2010-09-18 |
>Ben Finney
>
>___
>Tutor maillist  -  Tutor@python.org
>To unsubscribe or change subscription options:
>https://mail.python.org/mailman/listinfo/tutor


___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor




-- 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
"A computer never does what you want... only what you tell it."
+wesley chun <http://google.com/+WesleyChun>  : wescpy at gmail : @wescpy 
<http://twitter.com/wescpy> 
Python training & consulting : http://CyberwebConsulting.com
"Core Python" books : http://CorePython.com
Python blog: http://wescpy.blogspot.com

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true” (was: don't understand iteration)

2014-11-10 Thread wesley chun
good catch, and definitely a distinction beginners should be more cognizant
of.

it's also good to recognize that a call to "bool(match)" would render that
statement correct, as the built-in/factory function will return what an
object evaluates to (True [re.match object] or/vs.False [None]).

On Mon, Nov 10, 2014 at 5:31 PM, Clayton Kirkwood 
wrote:

> I reported it. I feel all grown up now. Kind of like one of the
> boys(girls...)
>
> Clayton:<)
>
>
> >-Original Message-
> >From: Tutor [mailto:tutor-bounces+crk=godblessthe...@python.org] On
> >Behalf Of Ben Finney
> >Sent: Monday, November 10, 2014 3:24 PM
> >To: tutor@python.org
> >Subject: [Tutor] “has a value of True” versus “evaluates true” (was:
> >don't understand iteration)
> >
> >"Clayton Kirkwood"  writes:
> >
> >> Also of confusion, the library reference says:
> >>
> >> Match objects always have a boolean value of True. Since match() and
> >> search() return None when there is no match, you can test whether
> >> there was a match with a simple if statement:
> >>
> >> match = re.search(pattern, string)
> >> if match:
> >> process(match)
> >
> >The documentation is incorrect, as you point out: “have a boolean value
> >of True” implies that the value is identical to the built-in ‘True’
> >constant, which is never the case for these objects.
> >
> >Instead, the passage above should say “evaluates true in a boolean
> >context”.
> >
> >Would you be so kind as to report a bug to that effect
> >http://bugs.python.org/>?
> >
> >--
> > \   “The Vatican is not a state.… a state must have people. There |
> >  `\are no Vaticanians.… No-one gets born in the Vatican except by |
> >_o__)an unfortunate accident.” —Geoffrey Robertson, 2010-09-18 |
> >Ben Finney
> >
> >___
> >Tutor maillist  -  Tutor@python.org
> >To unsubscribe or change subscription options:
> >https://mail.python.org/mailman/listinfo/tutor
>
>
> ___
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>



-- 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
"A computer never does what you want... only what you tell it."
+wesley chun  : wescpy at gmail : @wescpy

Python training & consulting : http://CyberwebConsulting.com
"Core Python" books : http://CorePython.com
Python blog: http://wescpy.blogspot.com
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] “has a value of True” versus “evaluates true” (was: don't understand iteration)

2014-11-10 Thread Clayton Kirkwood
I reported it. I feel all grown up now. Kind of like one of the boys(girls...)

Clayton:<)


>-Original Message-
>From: Tutor [mailto:tutor-bounces+crk=godblessthe...@python.org] On
>Behalf Of Ben Finney
>Sent: Monday, November 10, 2014 3:24 PM
>To: tutor@python.org
>Subject: [Tutor] “has a value of True” versus “evaluates true” (was:
>don't understand iteration)
>
>"Clayton Kirkwood"  writes:
>
>> Also of confusion, the library reference says:
>>
>> Match objects always have a boolean value of True. Since match() and
>> search() return None when there is no match, you can test whether
>> there was a match with a simple if statement:
>>
>> match = re.search(pattern, string)
>> if match:
>> process(match)
>
>The documentation is incorrect, as you point out: “have a boolean value
>of True” implies that the value is identical to the built-in ‘True’
>constant, which is never the case for these objects.
>
>Instead, the passage above should say “evaluates true in a boolean
>context”.
>
>Would you be so kind as to report a bug to that effect
>http://bugs.python.org/>?
>
>--
> \   “The Vatican is not a state.… a state must have people. There |
>  `\are no Vaticanians.… No-one gets born in the Vatican except by |
>_o__)an unfortunate accident.” —Geoffrey Robertson, 2010-09-18 |
>Ben Finney
>
>___
>Tutor maillist  -  Tutor@python.org
>To unsubscribe or change subscription options:
>https://mail.python.org/mailman/listinfo/tutor


___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor