13 Comments

  1. A similar problem exists for keywords:

    >>> abs(-1)
    1
    >>> abs=1
    >>> abs(-1)
    Traceback (most recent call last):
    File “”, line 1, in ?
    TypeError: ‘int’ object is not callable

    Contrast with Ruby

    irb(main):001:0> -1.abs
    => 1
    irb(main):002:0> -1.abs =3
    NoMethodError: undefined method `abs=’ for -1:Fixnum
    from (irb):2
    irb(main):003:0>

  2. This is not crazy. You have assigned the ‘False’ bool type to ‘a’, and you get what you expected. :-)

    Actually, python must deny the use of True and False as l-values.

  3. Pramod: C++ has true and false as special keywords from the beginning. Python just added it (relatively) recently and apparently things like these are still possible.

  4. Aggelos: Yes, that actually works :| , I guess they have `True` and `False` as just instances of the `bool` class and hence things like these are possible i.e. they are not keywords, they are just objects which can be manipulated like any other.

  5. Sridhar: I know what the program is doing. I expected it not to allow assignment to `True` and `False`, that is what I am surprised about.

  6. True and False are not constants in Python. In fact they are the only possible instances of the new ‘bool’ type.

    >>> c = bool(5)
    >>> c
    True
    >>> c = bool(0)
    >>> c
    False

    However Python should be setting these names as immutable, similar to the None keyword in 2.4

  7. Anything that is not a keyword can be overrided, and there are very few keywords on purpose! It’s not a wart, it’s a design decision. Live with it :)

    Python is for consenting adults.

  8. john compared ruby properties with python names
    Not a good comparision

    I think this is closer to what john demonstrated in ruby
    using python properties

    >>>class absInt(int):
    … abs = property(fget=lambda self: abs(self))
    >>> i = absInt(-1)
    >>> i.abs
    1
    >>> i.abs = 5
    Traceback (most recent call last):
    File “”, line 1, in ?
    AttributeError: can’t set attribute
    >>>

    I think i like the idea of limiting the number of keywords the way python does.

Comments are closed.