question of style
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Sun Jul 5 12:00:03 EDT 2009
On Sun, 05 Jul 2009 03:08:16 -0700, Paul Rubin wrote:
> Steven D'Aprano <steve at REMOVE-THIS-cybersource.com.au> writes:
>> > Yes, it saves a few keystrokes to say "if x:" instead of "if
>> > len(x)==0:" or even "if bool(x):",
>>
>> It's not about saving keystrokes -- that's a furphy. It's about
>> encapsulation. Objects are in a better position to recognise when they
>> are "something" (true) or "nothing" (false) than you are.
>
> I don't know what a furphy is,
Is your Google broken? *wink*
http://en.wikipedia.org/wiki/Furphy
> but I don't accept that "somethingness"
> vs. "nothingness" is the same distinction as truth vs falsehood.
It's the distinction used by Python since the dawn of time. Python only
grew a bool type a few versions back.
> True
> and False are values in a specific datatype (namely bool), not abstract
> qualities of arbitrary data structures.
I'm not talking about the constants True and False (nouns), but about
true and false values (adjectives).
> The idea that the "if"
> statement selects between "somethingness" and "nothingness" rather than
> between True and False is a bogus re-imagining of the traditional
> function of an "if" statement
There's nothing bogus about it.
Some languages such as Pascal and Java require a special Boolean type for
if-branches. Other languages, like Forth, C, Lisp and Ruby do not.
http://en.wikipedia.org/wiki/Boolean_data_type
> and has been an endless source of bugs in Python code.
I wonder why these "endless" bugs weren't important enough to be
mentioned in the rationale to PEP 285:
http://www.python.org/dev/peps/pep-0285/
You'd think something as vital as "if x Considered Harmful" would have
made it into the PEP, but no. Instead Guido *explicitly* stated that he
had no intention of forcing `if` to require a bool, describing `if x` as
the "correct form" and calling scrapping such a feature as "crippling the
language".
> Look how much confusion it causes here in the newsgroup all the time.
The only confusion is that you're causing me. Would you care to link to
some?
>> "if len(x) == 0" is wasteful. Perhaps I've passed you a list-like
>> iterable instead of a list, and calculating the actual length is O(N).
>
> That doesn't happen in any of Python's built-in container types.
And if they were the only types possible in Python, that might be
relevant.
> I
> could see some value to having a generic "is_empty" predicate on
> containers though, to deal with this situation.
We have that already. It's spelled __bool__ or __nonzero__, and it
applies to any object, not just containers.
> Your iterable could
> support that predicate. In fact maybe all iterables should support that
> predicate. They don't (and can't) all support "len".
Iterators are a special case, because in general they can't tell if
they're exhausted until they try to yield a value.
>> If you write len(x)==0 Python doesn't complain if x is a dict instead
>> of the list you were expecting. Why is it acceptable to duck-type
>> len(x) but not truth-testing?
>
> I haven't seen the amount of bugs coming from generic "len" as from
> something-vs-nothing confusion.
Again with these alleged bugs.
--
Steven
More information about the Python-list
mailing list