[Python-ideas] bool keyword: (was [Python-Dev] bool conversion wart?)

Ron Adam rrr at ronadam.com
Sat Mar 3 04:19:33 CET 2007


Collin Winter wrote:
> On 3/2/07, Ron Adam <rrr at ronadam.com> wrote:
>> Collin Winter wrote:
>> > On 3/2/07, Ron Adam <rrr at ronadam.com> wrote:
>> >> Josiah Carlson wrote:
>> >> > Ron Adam <rrr at ronadam.com> wrote:
>> >> >> Interpretation:
>> >> >>
>> >> >> The "small" inconsistency (if any) here is the 'not' keyword vs the
>> >> >> 'bool()' constructor. They pretty much do the same thing yet 
>> work in
>> >> >> modestly different ways.
>> >> >
>> >> > Maybe I'm missing something, but is there a place where the
>> >> following is
>> >> > true?
>> >> >
>> >> >     (not not x) != bool(x)
>> >> >
>> >> > I can't think of any that I've ever come across.
>> >> >
>> >> >  - Josiah
>> >>
>> >> I don't think you are missing anything.  I did say it was a *small*
>> >> inconsistency in how they are used in relation to 'and', 'or' and 
>> 'not'.
>> >> ie.. a constructor vs a keyword in a similar situation.
>> >
>> > 'and', 'or' and 'not' are operators (and hence keywords) because
>> > making them functions is incredibly ugly: and(or(a, b), not(c)).
>>
>> I agree.
>>
>> > Changing "bool(x)" to "bool x" introduces a much larger inconsistency
>> > between bool and the other built-in types.
>>
>> A bool keyword would not be a built-in type but be an operator just like
>> 'and', 'or', and 'not'.  So it would be even more consistent.
> [snip]
>> Bool() with a capital 'B' would be the built in type and only the very
>> *tiny* naming inconsistency of the capital 'B' would exist in relation to
>> 'int' and the other built_in types.
>>
>> So I think this adds more consistency than it does inconsistency.
> 
> Added consistency:
> - Things related to booleans are operators (bool, not, and, or).

Yes

> Added inconsistency:
> - The Bool type does not follow the same naming convention as int,
> float, dict, list, tuple and set.

Ok, so name the type boolean instead.


> - There's now a keyword that has 99% of the same spelling, 

It can be good it has the same *exact* semantics and spelling.  That makes 
it easier to migrate code

> fulfills *fewer* of the same uses-cases

The only difference I can think of is in testing for a bool type.  boolean 
would need to be used instead of bool.


> and has the *exact* same semantics as a built-in constructor/function.

This is not an uncommon thing in python.

    [1,2,3]     <==>  list((1,2,3))
    {'a':1}     <==>  dict(a=1)

Currently:
    not not n   <==>   bool(n)
    not n       <==>   bool(not n)

Alternative:
    bool n      <==>   boolean(n)
    not n       <==>   boolean(not n)


I suspect the biggest reason against this suggestion is it changes the 
status quo.

As to weather or not it is a keyword,  there is just as strong an argument 
against 'not' not being a keyword as there is for 'bool' being a keyword. 
But the addition of new keywords is historically something to be avoided 
with python.  In this case, I feel boolean types have become such a 
fundamental object in python that this just may be doable.



So with the above changes you have...

   * bool becomes an operator
   * boolean() replaces bool() as a constructor.


Consistency:
   + 1    Things related to booleans are operators (bool, not, and, or).

Performance:
   + .5   Compiler is able to generate more specific byte code.
          (This is probably only a small benefit so it only gets +.5)

Keyword:
   - 1    it *is* a new keyword, which is something to be avoided.

Name:
   + 1    The bool operator is the same as the old constructor
          enabling easy migration.

   - 1    A different name 'boolean' must be used to test for boolean types.


And the total is...  + .5

And If you add in a -1 for anything that changes anything for the sake that 
people just don't like changes in general.  ie... changing the status quo.

It then becomes ...  -.5



Does that sound like a fair evaluation?

<shrug> I tried.  ;-)

_Ron








More information about the Python-ideas mailing list