473,508 Members | 2,133 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Override 'and' and 'or'

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

Oct 7 '07 #1
13 1873
Dekker <m.**********@gmail.comwrote:
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
Oct 7 '07 #2
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
Oct 7 '07 #3
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.
Oct 7 '07 #4
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
Oct 7 '07 #5
Wildemar Wildenburger wrote:
[whate everyone else wrote :(]

/W
Dangit! 4th of 4.
Gotta type quicker.

/W
Oct 7 '07 #6
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.
Oct 7 '07 #7
On 7 Okt., 16:19, Steven D'Aprano <st...@REMOVE-THIS-
cybersource.com.auwrote:
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

Oct 7 '07 #8
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
Oct 7 '07 #9
On Oct 7, 4:48 pm, Dekker <m.aschwan...@gmail.comwrote:
On 7 Okt., 16:19, Steven D'Aprano <st...@REMOVE-THIS-

cybersource.com.auwrote:
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.

Oct 7 '07 #10
Steven D'Aprano a écrit :
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".
keyboard !-)
Oct 7 '07 #11
Kay Schluehr schrieb:
On Oct 7, 4:48 pm, Dekker <m.aschwan...@gmail.comwrote:
>On 7 Okt., 16:19, Steven D'Aprano <st...@REMOVE-THIS-

cybersource.com.auwrote:
>>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
Very cool, didn't know that.

Diez
Oct 7 '07 #12
On 8/10/2007 1:57 AM, Diez B. Roggisch wrote:
Kay Schluehr schrieb:
>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

Very cool, didn't know that.
<rant>

Not very cool at all IMHO, because:
1. There's no other way to avoid unnecessarily evaluating the second
operand besides using jumps.
2. POP_TOP [used even in normal test & jump situations] is horrible, and
there are long-known better ways of doing it:

E.g. "Recursive Descent Compiling", by A.J.T. Davie and R. Morrison
[pub: Ellis Horwood, Chichester, 1981] says on page 146: "... jumptt
branches if the top stack element is true and merely removes it
otherwise. A similar sequence can be used for 'and' but with jumpff
replacing jumptt."

C Python uses two JUMP_IF_bool[_NEVER_POP] instructions, followed in
most cases by POP_TOP.

E.g.
>>dis.dis(lambda: tval if arg else fval)
1 0 LOAD_GLOBAL 0 (arg)
3 JUMP_IF_FALSE 7 (to 13)
6 POP_TOP
7 LOAD_GLOBAL 1 (tval)
10 JUMP_FORWARD 4 (to 17)
> 13 POP_TOP
14 LOAD_GLOBAL 2 (fval)
> 17 RETURN_VALUE
>>>
IMHO 4 more jump instructions
2 x JUMP_IF_bool_ALWAYS_POP (simple cases)
and 2 x JUMP_IF_bool_ELSE_POP (and/or)
would be very useful.

</rant>
Oct 7 '07 #13
On 10/7/07, Dekker <m.**********@gmail.comwrote:
>
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))
PEP 335 is a proposal to allow overriding of the logical 'and', 'or' operators:

See <http://www.python.org/dev/peps/pep-0335/and the discussion of
it at <http://mail.python.org/pipermail/python-dev/2004-September/048791.html>

A.
Oct 8 '07 #14

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
2636
by: Ed | last post by:
Greetings! I'm trying to implement own collection BaseCollection (inherited from NameObjectCollectionBase class), but my attempt to override NameObjectCollectionBase virtual method public virtual...
3
3105
by: Woodmon | last post by:
Example of my CSS follows: <style type="text/css" media="screen"> BODY { color: white } A:link { color: 66CCFF; } A:visited { color: CC66FF; } A:active { color: CC66FF; } A:hover {...
0
3968
by: Craig Schneider | last post by:
// Is there any way to override the XML Serialization of the following SimpleClass // to turn off the DefaultValue of a boolean? Sure, I can override the DefaultValue from // true to false, but...
11
21474
by: apex | last post by:
Hi All : How to override the class operator = like C++ ? Best regards !
5
2582
by: Mark Broadbent | last post by:
Oh yes its that chestnut again! Ive gone over the following (http://www.yoda.arachsys.com/csharp/faq/ -thanks Jon!) again regarding this subject and performed a few of my own tests. I have two...
5
9575
by: Stoyan | last post by:
Hi All, I don't understand very well this part of MSDN: "Derived classes that override GetHashCode must also override Equals to guarantee that two objects considered equal have the same hash code;...
7
4527
by: AWHK | last post by:
How can I force anyone who subclasses my class to override the ToString() method? Andreas :-)
2
4041
by: Adriano Coser | last post by:
Hello. After I converted my .net code to the new VC2005 syntax I started to get C4490 on my ExpandableObjectConverter subclass overrides. The GetProperties method is no longer called by the...
3
1329
by: Tony Johansson | last post by:
Hello! I have noticed that you can write this override in two different ways. You can either write in this way public override string ToString() { return something; }
2
1313
by: Your_Persona | last post by:
Is there a way to get effect1 with the method in effect2? ///////////////////////////////////////////////////////////////////////////////////////////// using System; using...
0
7124
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7326
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
7385
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
1
7046
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
7498
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
3195
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The...
0
1558
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
1
766
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
418
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.