[code]
$ python2.4
True,False = False, True
True
False
False
True
a = True
if a:
… print ‘Hello World’
…
if not a:
… print ‘Hello World’
…
Hello World
[/code]
I am a big-time Python fan but this is crazy!
[code]
$ python2.4
True,False = False, True
True
False
False
True
a = True
if a:
… print ‘Hello World’
…
if not a:
… print ‘Hello World’
…
Hello World
[/code]
I am a big-time Python fan but this is crazy!
Comments are closed.
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>
I tried this in C++: true = false
And the compiler says, “error: non-lvalue in assignment”
I wonder how that works in Python.
Wow. Why can you do that? Assign values to False and True?
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.
John: Thanks for pointing that out. Looks like there are still many warts in Python.
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.
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.
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.
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
This should not happen. may be u can suggest python guys not to allow True or False as lvalue.
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.
This has a lot of potential for obfuscated stuff. :)
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.