Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Override 'and' and 'or'

Reply
Thread Tools

Override 'and' and 'or'

 
 
Dekker
Guest
Posts: n/a
 
      10-07-2007
Is it possible to override 'and' and/or 'or'? I cannot find a special
method for it... __and__ and __rand__ and __or__ and __ror__ are for
binary manipulation... any proposals?

Have marvelous sunday,
Marco

 
Reply With Quote
 
 
 
 
Lawrence Oluyede
Guest
Posts: n/a
 
      10-07-2007
Dekker <(E-Mail Removed)> wrote:
> Is it possible to override 'and' and/or 'or'? I cannot find a special
> method for it... __and__ and __rand__ and __or__ and __ror__ are for
> binary manipulation... any proposals?


If you want to customize the truth value testing you have to implement
__nonzero__

"
__nonzero__( self)
Called to implement truth value testing, and the built-in operation
bool(); should return False or True, or their integer equivalents 0 or
1. When this method is not defined, __len__() is called, if it is
defined (see below). If a class defines neither __len__() nor
__nonzero__(), all its instances are considered true.
"

Keep in mind the relation between __len__ and __nonzero__

ps. why you need to customize such a thing?

--
Lawrence, oluyede.org - neropercaso.it
"It is difficult to get a man to understand
something when his salary depends on not
understanding it" - Upton Sinclair
 
Reply With Quote
 
 
 
 
Steven D'Aprano
Guest
Posts: n/a
 
      10-07-2007
On Sun, 07 Oct 2007 13:52:15 +0000, Dekker wrote:

> Is it possible to override 'and' and/or 'or'?


Not without hacking the Python source code, in which case what you've got
is no longer Python.

Why do you want to do so?


--
Steven.
 
Reply With Quote
 
Bruno Desthuilliers
Guest
Posts: n/a
 
      10-07-2007
Dekker a écrit :
> Is it possible to override 'and' and/or 'or'? I cannot find a special
> method for it... __and__ and __rand__ and __or__ and __ror__ are for
> binary manipulation... any proposals?


http://docs.python.org/ref/customization.html
"""
__nonzero__( self)
Called to implement truth value testing, and the built-in operation
bool(); should return False or True, or their integer equivalents 0 or
1. When this method is not defined, __len__() is called, if it is
defined (see below). If a class defines neither __len__() nor
__nonzero__(), all its instances are considered true.
"""

Not that in Python, 'and' don't yield bools:

>>> "aa" and "bb"

'bb'
>>> "aa" and None # yields None
>>> "aa" and 0

0
>>> "aa" or "bb"

'aa'
>>> 0 or "bb"

'bb'
>>> None or "bb"

'bb'
>>> "aa" or 0

'aa'
>>> "aa" or None

'aa'
>>>


HTH
 
Reply With Quote
 
Wildemar Wildenburger
Guest
Posts: n/a
 
      10-07-2007
Dekker wrote:
> Is it possible to override 'and' and/or 'or'? I cannot find a special
> method for it... __and__ and __rand__ and __or__ and __ror__ are for
> binary manipulation... any proposals?
>
> Have marvelous sunday,
> Marco
>

I guess you're looking for __nonzero__()
<URL:http://docs.python.org/ref/customization.html>.

You don't actually override the boolean operators, you just tell the
object how to tell others if it evaluates to True or False
(Truth-testing isn't a binary operation; cf. bool(my_object)).

/W
 
Reply With Quote
 
Wildemar Wildenburger
Guest
Posts: n/a
 
      10-07-2007
Wildemar Wildenburger wrote:
> [whate everyone else wrote ]
>
> /W


Dangit! 4th of 4.
Gotta type quicker.

/W
 
Reply With Quote
 
Steven D'Aprano
Guest
Posts: n/a
 
      10-07-2007
On Sun, 07 Oct 2007 16:24:35 +0200, Wildemar Wildenburger wrote:

> Wildemar Wildenburger wrote:
>> [whate everyone else wrote ]
>>
>> /W

>
> Dangit! 4th of 4.
> Gotta type quicker.



That's okay, in two weeks time there will be 139 messages in this thread,
it will have devolved into an argument about whether Python's truth-
testing semantics are better or worse than whatever Java/Lisp/Haskell/
Ruby does, and *then* somebody will respond to the Original Poster with
"customize the __and__ and __or__ methods of your class".

Happens every time.



--
Steven.
 
Reply With Quote
 
Dekker
Guest
Posts: n/a
 
      10-07-2007
On 7 Okt., 16:19, Steven D'Aprano <st...@REMOVE-THIS-
cybersource.com.au> wrote:
> On Sun, 07 Oct 2007 13:52:15 +0000, Dekker wrote:
> > Is it possible to override 'and' and/or 'or'?

>
> Not without hacking the Python source code, in which case what you've got
> is no longer Python.
>
> Why do you want to do so?
>
> --
> Steven.


Well I think it is not possible what I wanted to achieve. By
overriding the "and" and "or" keyword I wanted to return a new object:

SqlValueInt(4) and SqlValueInt(5) --> SqlOpAnd(SqlValueInt(4),
SqlValueInt(5))

This is only possible for: +, -, /, *, >, >=, ...

Well... I have to live with the (binary) __and__, __or__ option and
the user has to write:

SqlValueInt(4) & SqlValueInt(5) --> SqlOpAnd(SqlValueInt(4),
SqlValueInt(5))

Thanks for your input, but __nonzero__ is not of any help in this
case... I want to abuse the "magic" functions for some transformations
and not some evaluation.

Marco

 
Reply With Quote
 
Wildemar Wildenburger
Guest
Posts: n/a
 
      10-07-2007
Dekker wrote:
> Well... I have to live with the (binary) __and__, __or__ option and
> the user has to write:
>
> SqlValueInt(4) & SqlValueInt(5) --> SqlOpAnd(SqlValueInt(4),
> SqlValueInt(5))
>
> Thanks for your input, but __nonzero__ is not of any help in this
> case... I want to abuse the "magic" functions for some transformations
> and not some evaluation.
>

Then again, you could always write a function that does this. I know, I
know ...

/W
 
Reply With Quote
 
Kay Schluehr
Guest
Posts: n/a
 
      10-07-2007
On Oct 7, 4:48 pm, Dekker <(E-Mail Removed)> wrote:
> On 7 Okt., 16:19, Steven D'Aprano <st...@REMOVE-THIS-
>
> cybersource.com.au> wrote:
> > On Sun, 07 Oct 2007 13:52:15 +0000, Dekker wrote:
> > > Is it possible to override 'and' and/or 'or'?

>
> > Not without hacking the Python source code, in which case what you've got
> > is no longer Python.

>
> > Why do you want to do so?

>
> > --
> > Steven.

>
> Well I think it is not possible what I wanted to achieve. By
> overriding the "and" and "or" keyword I wanted to return a new object:
>
> SqlValueInt(4) and SqlValueInt(5) --> SqlOpAnd(SqlValueInt(4),
> SqlValueInt(5))
>
> This is only possible for: +, -, /, *, >, >=, ...
>
> Well... I have to live with the (binary) __and__, __or__ option and
> the user has to write:
>
> SqlValueInt(4) & SqlValueInt(5) --> SqlOpAnd(SqlValueInt(4),
> SqlValueInt(5))
>
> Thanks for your input, but __nonzero__ is not of any help in this
> case... I want to abuse the "magic" functions for some transformations
> and not some evaluation.
>
> Marco


You can see what "and" and "or" are actually doing:

import dis
dis.dis(lambda: x or y and z)

1 0 LOAD_GLOBAL 0 (x)
3 JUMP_IF_TRUE 11 (to 17)
6 POP_TOP
7 LOAD_GLOBAL 1 (y)
10 JUMP_IF_FALSE 4 (to 17)
13 POP_TOP
14 LOAD_GLOBAL 2 (z)
>> 17 RETURN_VALUE


Here you can see nicely that they are not implemented as specialized
opcodes but being compiled to jumps. This causes their lazy nature. If
"and" would be implemented as a normal ( eager ) operator a statement
like:

if l and l[0] == 2:
BLOCK

would raise an IndexError if l is empty.



 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
A question (and answer) for the Ruby FAQ: override and overload Stephan Kämper Ruby 2 01-24-2005 01:05 PM
Preprocessor gcc and override bigbinc C++ 2 01-02-2004 08:42 PM
Java MIDP on Palm - override String and Image Item layouts Kurt Milligan Java 1 09-15-2003 09:32 PM
Re: Override malloc,calloc,realloc and free? Dan Pop C Programming 0 06-26-2003 04:52 PM
Re: Override malloc,calloc,realloc and free? Jun Woong C Programming 0 06-26-2003 03:49 PM



Advertisments