replace mothod for only one object but not for a class

2008-10-14 Thread hofer
Hi,

I have multiple objects all belonging to the same class
 (which I didn't implement and whose code I don't want to modify)

Now I'd like to change one method for one object only (after it has
been created) without adding any overhead
to the call of the other object's methods.


Is this possible?

Example
# This is NOT what I'd like to do
# as it overwrites the method for all objects of this class
o1 = aclass()
o2 = aclass()
# call original method
o1.method()
o2.method()
# overwrite the method for the entire class
aclass.method = mymethod
o1.method() # now new method
o2.method() # now new method


### What doesn't work, but what I'd like to do
o1 = aclass()
o2 = aclass()
# call original method
o1.method()
o2.method()
# overwrite the method for the entire class
o1.method = mymethod
o1.method() # now new method
o2.method() # still old method


thanks for any pointers.


P.S. I guess, that there is a computer science term for what I try to
achieve.
If anybody knew it I would be interested to learn it as well.

--
http://mail.python.org/mailman/listinfo/python-list


Re: replace mothod for only one object but not for a class

2008-10-15 Thread hofer
On Oct 14, 7:50 pm, hofer <[EMAIL PROTECTED]> wrote:
> Hi,
>
> I have multiple objects all belonging to the same class
>  (which I didn't implement and whose code I don't want to modify)
>
> Now I'd like to change one method for one object only (after it has
> been created) without adding any overhead
> to the call of the other object's methods.
>
> Is this possible?
>
> Example
> # This is NOT what I'd like to do
> # as it overwrites the method for all objects of this class
> o1 = aclass()
> o2 = aclass()
> # call original method
> o1.method()
> o2.method()
> # overwrite the method for the entire class
> aclass.method = mymethod
> o1.method() # now new method
> o2.method() # now new method
>
> ### What doesn't work, but what I'd like to do
> o1 = aclass()
> o2 = aclass()
> # call original method
> o1.method()
> o2.method()
> # overwrite the method for the entire class
> o1.method = mymethod
> o1.method() # now new method
> o2.method() # still old method
>
> thanks for any pointers.
>
> P.S. I guess, that there is a computer science term for what I try to
> achieve.
> If anybody knew it I would be interested to learn it as well.


Thanks a lot this works.
Though I must admint, that even after reading the doc I don't really
understand why.
--
http://mail.python.org/mailman/listinfo/python-list


Re: replace mothod for only one object but not for a class

2008-10-15 Thread hofer
Hi

> > hofer a écrit :
> >> I have multiple objects all belonging to the same class
> >>  (which I didn't implement and whose code I don't want to modify)
>
> >> Now I'd like to change one method for one object only (after it has
> >> been created) without adding any overhead
> >> to the call of the other object's methods.

Thanks for all of your answers:

Here an example with three of the suggested solutions:
(I didn't succeed in implementing Jason's solution with my
example)


import threading
# some objects
a = threading.Event()
b = threading.Event()
c = threading.Event()
d = threading.Event()

def run_dly(o): # a test function
print o,"start",
o.wait(1)
print "stop"

# unmodified test
run_dly(a)
run_dly(b)
run_dly(c)
run_dly(d)

# The new Method
def verbose_wait(self,dly):
print "VERBOSE",
threading._Event.wait(self,dly)

### Implemented with partial
from functools import partial
b.wait = partial(verbose_wait,b)

###   with __get__ for new classes
c.wait = verbose_wait.__get__(c,type(c))

## with new for old classes
import new
d.wait = new.instancemethod(verbose_wait,d,type(d))

run_dly(a)
run_dly(b)
run_dly(c)
run_dly(d)
# end
thanks again

Hofer

--
http://mail.python.org/mailman/listinfo/python-list


converting a sed / grep / awk / . . . bash pipe line into python

2008-09-02 Thread hofer
Hi,

Something I have to do very often is filtering / transforming line
based file contents and storing the result in an array or a
dictionary.

Very often the functionallity exists already in form of a shell script
with sed / awk / grep , . . .
and I would like to have the same implementation in my script

What's a compact, efficient (no intermediate arrays generated /
regexps compiled only once) way in python
for such kind of 'pipe line'

Example 1 (in bash):  (annotated with comment (thus not working) if
copied / pasted
#---
cat file \   ### read from file
| sed 's/\.\..*//' \### remove '//' comments
| sed 's/#.*//' \   ### remove '#' comments
| grep -v '^\s*$'  \### get rid of empty lines
| awk '{ print $1 + $2 " " $2 }' \ ### knowing, that all remaining
lines contain always at least
\   ### two integers calculate
sum and 'keep' second number
| grep '^42 ' ### keep lines for which sum is 42
| awk '{ print $2 }' ### print number

Same example in perl:
# I guess (but didn't try), taht the perl example will create more
intermediate
# data structures than necessary.
# Ideally the python implementation shouldn't do this, but just
'chain' iterators.
#---
my $filename= "file";
open(my $fh,$filename) or die "failed opening file $filename";

# order of 'pipeline' is syntactically reversed (if compared to shell
script)
my @numbers =
map { $_->[1] }   # extract num 2
grep { $_->[0] == 42   }  # keep lines with result 42
map { [ $_->[0]+$_->[1],$_->[1] ]  }  # calculate sum of first two
nums and keep second num
map { [ split(' ',$_,3) ]  }  # split by white space
grep { ! ($_ =~ /^\s*$/) }# remove empty lines
map { $_ =~ s/#.*//; $_}  # strip '#' comments
map { $_ =~ s/\/\/.*// ; $_}  # strip '//' comments
<$fh>;
print "Numbers are:\n",join("\n",@numbers),"\n";

thanks in advance for any suggestions of how to code this (keeping the
comments)


H




--
http://mail.python.org/mailman/listinfo/python-list


dict slice in python (translating perl to python)

2008-09-10 Thread hofer
Hi,

Let's take following perl code snippet:

%myhash=( one  => 1, two   => 2, three => 3 );
($v1,$v2,$v3) = @myhash{qw(one two two)}; # <-- line of interest
print "$v1\n$v2\n$v2\n";

How do I translate the second line in a similiar compact way to
python?

Below is what I tried. I'm just interested in something more compact.

mydict={ 'one'   : 1, 'two'   : 2, 'three' : 3 }
# first idea, but still a little too much to type
[v1,v2,v3] = [ mydict[k] for k in ['one','two','two']]

# for long lists lazier typing,but more computational intensive
# as  split will probably be performed at runtime and not compilation
time
[v1,v2,v3] = [ mydict[k] for k in 'one two two'.split()]

print "%s\n%s\n%s" %(v1,v2,v3)



thanks for any ideas

--
http://mail.python.org/mailman/listinfo/python-list


Re: dict slice in python (translating perl to python)

2008-09-11 Thread hofer
Thanks a lot for all your answers.

There's quite some things I learnt :-)

[v1,v2,v3] = ...
can be typed as
v1,v2,v3 = . . .

I also wasn't used to
map(myhash.get, ['one', 'two', 'two'])
itemgetter('one', 'one', 'two')(x)

I also didn't know
print "%(one)s\n%(two)s\n%(two)s" % mydict


The reason I'd like to have a short statement for above is, that this
is for me basically just
some code, to name and use certain fields of a hash in i given code
section.

The real example would be more like:

name,age,country = itemgetter('name age country'.split())(x) # or any
of my above versions

# a lot of code using name / age / country



thanks a gain and bye

H
On Sep 10, 5:28 pm, hofer <[EMAIL PROTECTED]> wrote:
> Let's take following perl code snippet:
>
> %myhash=( one  => 1    , two   => 2    , three => 3 );
> ($v1,$v2,$v3) = @myhash{qw(one two two)}; # <-- line of interest
> print "$v1\n$v2\n$v2\n";
>
> How do I translate the second line in a similiar compact way to
> python?
>
> Below is what I tried. I'm just interested in something more compact.
>
> mydict={ 'one'   : 1    , 'two'   : 2    , 'three' : 3 }
> # first idea, but still a little too much to type
> [v1,v2,v3] = [ mydict[k] for k in ['one','two','two']]
>
> # for long lists lazier typing,but more computational intensive
> # as  split will probably be performed at runtime and not compilation
> time
> [v1,v2,v3] = [ mydict[k] for k in 'one two two'.split()]
>
> print "%s\n%s\n%s" %(v1,v2,v3)


--
http://mail.python.org/mailman/listinfo/python-list


Re: dict slice in python (translating perl to python)

2008-09-11 Thread hofer
On Sep 11, 10:36 am, Nick Craig-Wood <[EMAIL PROTECTED]> wrote:
>I'd type the explicit
>
>  v1,v2,v3 = mydict['one'], mydict['two'], mydict['two'] # 54 chars > Either 
> is only a couple more
> characters to  type.  It is completely
> explicit and comprehensible to everyone, in comparison to
>
>   v1,v2,v3 = [ mydict[k] for k in ['one','two','two']] # 52 chars
>   v1,v2,v3 = [ mydict[k] for k in 'one two two'.split()] # 54 chars
>
> Unlike perl, it will also blow up if mydict doesn't contain 'one'
> which may or may not be what you want.
>

Is your above solution robust against undefined keys.
In my example it would'nt be a problem. The dict would be fully
populated, but I'm just curious.


--
http://mail.python.org/mailman/listinfo/python-list


Understanding (and getting rid) of optparse.py:668: FutureWarning: %u/%o/%x/%X of negative int will return a

2008-09-26 Thread hofer
Hi,

I get following warning with a python script:


optparse.py:668: FutureWarning: %u/%o/%x/%X of negative int will
return a signed string in Python 2.4 and up


my code:
from optparse import OptionParser

if __name__ == '__main__':
parser = OptionParser()
parser.add_option('-G','--green',action= 'store_const', const=
'#00FF00' ,  dest='color',
   default='#808080',
help='life is so green')
parser.add_option('-R','--red',action= 'store_const', const =
'#FF' , dest='color',
help='I just see red')
# add more elaborated command line parsing and help text here
(options,argv) = parser.parse_args()
print 'options',options

I assume python wants to tell me that newer version will behave
differently for numeric arguments

What I wonder is: Why do I get the warning if my code doesn't try to
parse any numbers?

Is there any way to get rid of the warning without having to change
the python version?
(I noticed, the warning disappears if I remove the line printing
options)





thanks for any explanations. suggestions


H
--
http://mail.python.org/mailman/listinfo/python-list


Re: Understanding (and getting rid) of optparse.py:668: FutureWarning: %u/%o/%x/%X of negative int will return a

2008-09-26 Thread hofer
On Sep 26, 6:21 pm, Peter Otten <[EMAIL PROTECTED]> wrote:
> hofer wrote:
> > Hi,
>
> > I get following warning with a python script:
>
> > optparse.py:668: FutureWarning: %u/%o/%x/%X of negative int will
> > return a signed string in Python 2.4 and up
>
> You can print options.__dict__ instead of options with little loss of
> information, or turn the warning off
>
> python -Wignore::FutureWarning myscript.py
>
> Peter

Thanks a lot Peter,

Any trick to disable warnings just for a given range of code?


bye H

--
http://mail.python.org/mailman/listinfo/python-list