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. 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

  6. 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.

  7. 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.