And most of this thread has been nothing more than me asking "why"
did Guido
say to do that -- and people avoiding answering the question.
Wait, are you actually asking why bool is a doubleton? If nobody has
answered that, I think probably nobody understood you were asking it,
because it shouldn't need to be explained.
In some ways, yes I am asking that -- but in another I am not;
to be more precise -- Why did Guido refuse to allow refinement of
meaning when in industry -- logic equations generally are not limited to
Charles Bool's original work, but include practical enhancements of his
theories which make them far more useful.
A subclass is generally backward compatible in any event -- as it is
built upon a class, so that one can almost always revert to the base
class's meaning when desired -- but subclassing allows extended meanings
to be carried. eg: A subclass of bool is a bool -- but it can be MORE
than a bool in many ways.
One example: It can also be a union. So when Guido chose to cut off
subclassing -- his decision had a wider impact than just the one he
mentioned; eg: extra *instances* of True and False.... as if he were
trying to save memory or something.
The reason Guido's action puzzles me is twofold -- first it has been
standard industry practice to subclass singleton (or n-ton) objects to
expand their meaning in new contexts, and this practice has been
documented for many years. So -- why did Guido go against the general
OOP practice unless he didn't know about it?
The mere existence of a subclass does not threaten the integrity of
bools or security in Python in any way I can see -- as one can do a type
check, or a base type check, on an instance to decide how to handle a
subclass vs. base class instance. So I'm guessing he was concerned about
something else, but I don't know what.
In general -- it's not the goal of subclassing to create more instances
of the base types -- but rather to refine meaning in a way that can be
automatically reverted to the base class value (when appropriate) and to
signal to users that the type can be passed to functions that require a
bool because of backward compatibility.
Boolean algebra has two values: true and false, or 1 and 0, or humpty
and dumpty, or whatever you like to call them.
You're speaking to an Electrical engineer. I know there are 10 kinds of
people, those who know binary and those who don't. But you're way off
base if you think most industrial quality code for manipulating boolean
logic uses (or even can be restricted to use) only two values and still
accomplish their tasks correctly and within a finite amount of time.
The bool class
represents the values of boolean algebra. Therefore, there are two of
them. If I have an object that I know is an instance of bool, the
implication is that it is one of those two values, not something
potentially completely different.
Can you name any other language that *does* allow subclassing of
booleans or creation of new boolean values?
Yes. Several off the top of my head -- and I have mentioned these
before. They generally come with the extra subclasses pre-created and
the user doesn't get to create the classes, but only use them; none the
less -- they have more than two values with which to do logic equations
with.
VHDL, Verilog, HDL, Silos III, and there are IEEE variants also.
C/C++ historically allowed you to do it with instances included,
although I am not sure it still does.
The third value is usually called "TRI-state" or "don't care". (Though
its sometimes a misnomer which means -- don't know, but do care.)
Most of these high definition languages are used to do things like
design micorprocessors... eg: the very intel or arm processor you
typically run python on --- because trying to do it with boolean logic
and theorems of the past in a pencil and paper compatible strict
re-incarnation of what Charles Bool's did in his own time (even if done
by computer) -- rather than including De-morgan and all the many other
people who contributed afterward -- is about as red-neck backward as one
can get -- and often doomed to failure (though for small applications
you might get away with it.)
Often, only one extra ( tri state ) value is needed to do logic
verification and testing; but in some cases, notably, where the
exclusive 'or' function is involved, the relationship between don't care
inputs can become important and more values are required; eg: to detect
when in deeply nested logic, various sources of don't care inputs
interfere with each and themselves in constructive or destructive ways
to produce constant logic Trues or Falses.
We've discovered that we live in a quantum-mechanical universe -- yet
people still don't grasp the pragmatic issue that basic logic can be
indeterminate at least some of the time ?!
The name 'boolean logic' has never been re-named in honor of the many
people who developed the advancements in computers -- including things
like data sheets for electronic parts, or the code base used for solving
large numbers of simultaneous logic equations with uncertainty included
-- which have universally refined the boolean logic meanings found in
"Truth" tables having clearly more than two values -- but don't take my
word for it -- look in any digital electronics data book, and there they
will be more than two states; marked with rising edges, falling edges,
X's for don't cares, and so forth.
Even though the BASE values are 1 and 0 in all the cases I've mentioned
-- there is more to consider.
That sounds like premature optimization to me. Always subclassing
object when no more specific class is available would be a good habit
to get into. The savings you're talking about are not that great, it
will save you surprises when an old-style class doesn't do what you
expect, and it will produce code that is more compatible with and more
easily ported to Python 3.
Oh I agree -- but I meant e-mail space. Not just computer memory.
I wasn't going to use any of that in the example I showed D'Aprano and
didn't want to bother to type it up.
The example was only meant to show three things: I -- that a class type
can be used to replace an instance variable for a method can be called
on a class as opposed to only an instance II -- that types and
instances can both be arbitrarily placed in a list to determine their
relative lexical sorting order. III -- that both of these things can be
done without the class being instantiated.
All three of those things were demonstrated in the example -- so it was
good enough for my purposes. As to all of your other objections -- hell
-- I never intended that example to be used in a real life situation
beyond demonstrating the basic feasability of encoding data as a type.
As I said to D'Aprano -- even a *cursory* examination (eg: as in not
detailed) shows I could do things which he wasn't considering.
This seems fine, but I don't get why you're messing around with
subclassing tuples. Do you really want to have boolean values that are
iterable, indexable, etc. for no reason? Just create a normal class
(or maybe subclass int, to match the normal bool class) and let your
instances contain a tuple instead of being one.
Sorting traditionally allows and uses rich compares when sorting complex
data. (cf. the email's name) This point was examined earlier in the
thread by another poster, who suggested I wrap my values in a list to
allow
sort() functions to do a hierarchical compare.
Although I couldn't implement the sort in the way that poster
recommended
for various technical reasons -- none the less, their suggestion led
to a
fruitful study of how and when sort algorithms do comparisons and
what they
expect from them.
The tuple, then, is a natural object to contain an actual instance of
bool
(as opposed to a subclass) and work seamlessly with sorting algorithms
already available in python.
Which doesn't answer my question at all: why inherit from tuple when
composition would suffice? A boolean is not a tuple, so a boolean
class should not subclass tuple. It sounds to me like you turn to
subclassing as a solution much more quickly than is wise.
As a final note, please only post plain text messages to this
newsgroup, not html. Not everybody can easily read html messages, and
as you can probably see from this post it can mess up things like
reply quoting.
I don't have a setting on my email to turn off html. Sorry. Can't help.
I don't know what you mean about composition vs. sub-classing.
Would you care to show an example of how it would solve the problem and
still allow hierarchical sorting ?
I don't see how you can get pre-existing python functions (like sort,
max, and min) to accept a complex bool value and have that value
automatically revert to a True or False in an intelligent manner without
overloading the operators defined in some class -- somewhere -- to
operate on the data the class contains.
How do you intend to achieve that with this -- composition -- thing you
mentioned ?
--
https://mail.python.org/mailman/listinfo/python-list