On 06/15/2013 11:53 PM, Jim Mooney wrote:
On 15 June 2013 20:48, Joel Goldstick <joel.goldst...@gmail.com> wrote:

One and zero for True and False may seem not quite right today,

I still think they should be taken out and shot ;')

But my simplification plan failed. Equality always fails for different
types, and 'not in front of None or any empty object such as empty
string, empty list, empty tuple, or empty dict, is always True. But it
appears that idea fails for an empty class:

class NobodyHome: pass
x = NobodyHome()
print(not x) # Result is False when I thought this would be True.


The rules you're talking are not somehow mystically enforced by the compiler. They're definitions and conventions that are presumably consistently applied in the library code for each builtin or library type. But if you write your own, you get to make your own rules for if it's truthey or falsey.

Saying the class is empty is meaningless. Even a trivial class has many methods that it inherits from object. Anyway, if a class does not define its own truthy/falsey definition, then an instance of that class is always considered truthey.

The convention about list, tuple, dict, etc. is referring to collections, that implement a __len__() method. Add such a method to your class, and you too can decide whether a particular instance is truthey or falsey.

But since your class isn't a collection, it'd be clearer to define the method __bool__(), which is what's tried first. (In Python 3.x)

>>> class NobodyHome:
...     def __bool__(self):
... return False #normally, you'd be testing some attribute to decide this

...
>>> x = NobodyHome()
>>> not x
True

--
DaveA
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to