how to open a file in some application using Tkinter i am using TKINTER to create GUI application i want to know how to open a word document in open office or any other applicatio

2008-01-09 Thread brindly sujith
hi
i am using TKINTER to create GUI application

i want to know how to open a word document in open office or any other
application

please send me the tkinter coding for this
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: how to open a file in some application using Tkinter i am using TKINTER to create GUI application i want to know how to open a word document in open office or any other applicatio

2008-01-09 Thread Fredrik Lundh
brindly sujith wrote:

> i am using TKINTER to create GUI application
> 
> i want to know how to open a word document in open office or any other 
> application
> 
> please send me the tkinter coding for this

reposting the reply you received when you posted this on another mailing 
list:

---

on windows, you can use the "os.startfile" function:

  import os
  os.startfile("mydocument.doc")

(this is the same as double-clicking on a document in the file explorer)

on other platforms, use os.system() and specify what application to run:

  import os
  os.system("someapp mydocument.doc")

---



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


Re: Tkinter variable trace problem

2008-01-09 Thread C Martin

Thank you for your replies. I understand there are better ways to handle 
'normal' UI behavior, but I was curious about the trace feature and wanted to 
understand how it worked. I may not actually need it in my project, but I 
wanted to see what my options were. 

Thanks again.


--
Protect yourself from spam, 
use http://sneakemail.com
-- 
http://mail.python.org/mailman/listinfo/python-list


Pyflakes pre-commit hook in subversion

2008-01-09 Thread mobiledreamers
http://tarekziade.wordpress.com/2006/11/01/protecting-a-python-svn-code-base-with-the-pre-commit-hook/

Is it possible to check code in python before committing to svn

using pyflakes, pythontidy

*Pyflakes and Subversion*

Pyflakes  is a nice little utility
that checks your Python code for errors. The main advantage over PyChecker
and PyLint is that it is much faster and gives almost no false positives.
Today I wrote a little hack on top of the
enforcerpre-commit
script which forces the code you check in to pass pyflakes. Eg,
the users of svn will see the following output if they try to check in code
which has errors pyflakes can detect:

$ svn ci -m "fix" completion.py
Sendingcompletion.py
Transmitting file data .svn: Commit failed (details follow):
svn: 'pre-commit' hook failed with error output:
Pyflakes found 1 error(s)/warning(s):
kiwi/trunk/examples/completion.py:1: undefined name 'test'

The small "configuration" file for enforce can be found
here.

Can you share enforcer file? or a means to ensure safe code in python repo
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: stupid/style/list question

2008-01-09 Thread Duncan Booth
Fredrik Lundh <[EMAIL PROTECTED]> wrote:

> Giampaolo Rodola' wrote:
> 
>> To flush a list it is better doing "del mylist[:]" or "mylist = []"?
>> Is there a preferred way? If yes, why?
> 
> The latter creates a new list object, the former modifies an existing 
> list in place.
> 
> The latter is shorter, reads better, and is probably a bit faster in 
> most cases.
> 
> The former should be used when it's important to clear a specific list 
> object (e.g. if there are multiple references to the list).

I tried to measure this with timeit, and it looks like the 'del' is 
actually quite a bit faster (which I find suprising).

C:\Python25\Lib>timeit.py -s "lista=range(1)" "mylist=list(lista)"
1 loops, best of 3: 81.1 usec per loop

C:\Python25\Lib>timeit.py -s "lista=range(1)" "mylist=list(lista)" 
"del mylist[:]"
1 loops, best of 3: 61.7 usec per loop

C:\Python25\Lib>timeit.py -s "lista=range(1)" "mylist=list(lista)" 
"mylist=[]"
1 loops, best of 3: 80.9 usec per loop


In the first test the local variable 'mylist' is simply allowed to go 
out of scope, so the list is destroyed as its reference count drops to 
0.

In the third case again the list is destroyed when no longer referenced, 
but an empty list is also created and destroyed. Evidently the empty 
list takes virtually no time to process compared with the long list.

The second case clears the list before destroying it, and appears to be 
significantly faster.

Increasing the list length by a factor of 10 and it becomes clear that 
not only is #2 always fastest, but #3 always comes in second. Only when 
the lists are quite short (e.g. 10 elements) does #1 win (and even at 10 
elements #2 beats #3).

Unless I've missed something, it looks like there may be an avoidable 
bottleneck in the list code: whatever the slice delete is doing should 
also be done by the deletion code (at least if the list is longer than 
some minimum length).

The most obvious thing I can see is that list_dealloc:

if (op->ob_item != NULL) {
/* Do it backwards, for Christian Tismer.
   There's a simple test case where somehow this reduces
   thrashing when a *very* large list is created and
   immediately deleted. */
i = Py_Size(op);
while (--i >= 0) {
Py_XDECREF(op->ob_item[i]);
}
PyMem_FREE(op->ob_item);
}


would be better written as a copy of (or even call to) list_clear which 
picks up op->ob_item once instead of every time through the loop.

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


Re: Newbie question: Classes

2008-01-09 Thread Bruno Desthuilliers
Daniel Fetchinson a écrit :

nb: answering to the (unknown) OP:

>> Basically, I have created a program using tkinter without using any class
>> structure, simply creating widgets and functions (and finding ways around
>> passing variables from function to function, using global variables etc).

One of the points of OO is indeed to avoid excessive use of global state 
  and "cargo" data. Now note that this can also be (at least partially) 
done using closures, callbacks, partial application, and other 
functional tricks.

>> The program has become rather large ( lines?) I am trying to now put it into
>> a class structure, because I hear it is easier to handle.

It can make thing easier - from a maintainance/reusability POV at least 
- if you're at ease with OO design and programming. But getting OO right 
- specially when it comes to design - is not necessarily trivial 
neither, so don't think of it as a "silver bullet".

>> So basically, I put all the stuff into a class, making the widgets in the
>> "def __init__(self, root)" (root being my Tk() ) and then I have had to put
>> a "self." in front of any instance of any variable or widget. Is this right?

Probably not.

>> it seems like nothing is any easier (except having variables locally). Is
>> this right? Should I be creating more classes for different things or what?

Probably, yes. You could try to identify small sets of functions dealing 
with a common (small) set of data, and regroup them into (small) 
classes, then think about how instances of these classes will work 
together. Also remember to separate the "logic" (data structures and 
rules about these data structures) from the "presentation" (the GUI 
code). The "logic" part should be usable independantly (with a CLI 
interface, a web interface, etc).

My two cents...
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: copy a numpy array

2008-01-09 Thread Francesco Guerrieri
On Jan 9, 2008 6:35 AM, jimgardener <[EMAIL PROTECTED]> wrote:
> thanx guys for the replies
> need a little clarification
>
> srcarray=array([1.2,2.3,3.4,4.5,5.6])
> destarray=array(srcarray,copy=False)
>
> then
> srcarray[2]=99.9
> will cause the change to be reflected in both src and dest.
> doesn't that mean data is shared between both arrays?
>
> but if i do
> destarray=array(srcarray)
> or
> destarray=srcarray.copy()
> then the change in one array will not affect the other,meaning no data
> sharing
> ...want to know if  my understanding is right
> jim

You're right, I wrote too quickly and so I gave a wront information! sorry! :-)

Just try the following:
Apart from the copy method (which other have correctly pointed to),
the correct version  is simply:

a = numpy.array([1,2])
b = numpy.array(a)

and now try modifying one of them.

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


Re: Open a List of Files

2008-01-09 Thread Paul Hankin
On Jan 9, 2:41 am, Tim Chase <[EMAIL PROTECTED]> wrote:
> > I decided that I was just trying to be "too smooth by 1/2" so I fell back to
>
> > messages = open(os.path.join(host_path,'messages.txt'), 'wb')
> > deliveries = open(os.path.join(host_path,'deliveries.txt'), 'wb')
> > actions = open(os.path.join(host_path,'actions.txt'), 'wb')
> > parts = open(os.path.join(host_path,'parts.txt'), 'wb')
> > recipients = open(os.path.join(host_path,'recipients.txt'), 'wb')
> > viruses = open(os.path.join(host_path,'viruses.txt'), 'wb')
> > esp_scores = open(os.path.join(host_path,'esp_scores.txt'), 'wb')
>
> Another way to write this which reduces some of the code would be
>
>   filenames = ['messages', 'deliveries', 'actions', 'parts',
>     'recipients', 'viruses', 'esp_scores']
>
>   (messages, deliveries, actions, parts,
>     recipients, viruses, esp_scores) = [
>     open(os.path.join(host_path, '%s.txt' % fn), 'wb')
>     for fn in filenames
>     ]
>
> It becomes even more clear if you make an intermediate "opener"
> function such as
>
>   binwriter = lambda fname: open(
>       os.path.join(host_path, '%s.txt' % fname), 'wb')
>
>   (messages, deliveries, actions, parts,
>     recipients, viruses, esp_scores) = [
>     binwriter(fn) for fn in filenames]

This can be more cleanly written using locals()

for fn in filenames:
locals()[fn] = open(os.path.join(host_path, fname + '.txt', 'wb')

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


Re: Collecting Rich Data Structures for students

2008-01-09 Thread Martin Marcher
Paddy wrote:

> On Jan 9, 2:19 am, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]>
> wrote:
>> Some have offered XML repositories, which I can well
>> understand, but in this case we're looking specifically for
>> legal Python modules (py files), although they don't have
>> to be Latin-1 (e.g. the sushi types file might not have a
>> lot of romanji).

Are you asking for

class SushiList(object):
types = [sushi1, sushi2, sushi3, ...]

I don't quite get that, any reference to the original discussion?

/martin

-- 
http://noneisyours.marcher.name
http://feeds.feedburner.com/NoneIsYours

You are not free to read this message,
by doing so, you have violated my licence
and are required to urinate publicly. Thank you.

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


Strange problem: MySQL and python logging using two separate cursors

2008-01-09 Thread Frank Aune
Hi,

Explaining this problem is quite tricky, but please bear with me. 

Ive got an application which uses MySQL (InnoDB) for two things:

1. Store and retrieve application data (including viewing the application log)
2. Store the application log produced by the python logging module

The connection and cursor for the two tasks are completely separate, and they 
connect, query, execute and commit on their own. But they do use the same SQL 
database.

Task 1 typically consist of alot of SQL queries.

For task 2 I'm using the logging_test14.py example from the logging module as 
a template. (The only thing I've added basically is an escape_string() call 
to properly escape any SQL queries from task 1 logged by task 2 to the 
database.)

>From a MySQL shell I can view the logging updates as they are commited, eg. 
the log continues to grow when using the application.

But if I try to do the same from inside the application, the cursor in task 1 
will only return between 50 and 60 logentries, even though more updates 
exists (I can still view them as they grow from the MySQL shell). If I try to 
re-run the same query, the same 50-60 logentries are returned. No error, no 
message - nothing. 

To recap: task 2 writes all log messages to the database, and task 1 reads 
these same log messages based on user input and present them in a GUI.

I don't know if this is explained well enough, but its kind of tricky 
explaining such weird behaviour.

The only clue I have so far, is that the cursor in task 1 seems to be unable 
to "register" any new entries in the log table produced by task 2 as soon as 
task 1 perform an SQL query of some kind.

Im contemplating using the same cursor for task 1 and 2, but I think keeping 
them separate is a better design - if it only worked :)

Any input on this "nutcracker"?

Thanks,
Frank
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Natural-language datetime parsing and display (was: user friendly datetime features)

2008-01-09 Thread tahiriman
or just calculate the difference between the moment you are and the
date before and display the result in a cases (if diff is one day or 2
days or ...)
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Open a List of Files

2008-01-09 Thread Fredrik Lundh
Paul Hankin wrote:

> This can be more cleanly written using locals()
> 
> for fn in filenames:
> locals()[fn] = open(os.path.join(host_path, fname + '.txt', 'wb')

from the reference manual:

 locals()

 Update and return a dictionary representing the current
 local symbol table.

 Warning: The contents of this dictionary should not be
 modified; changes may not affect the values of local
 variables used by the interpreter.

examples:

 >>> def foo():
... locals()["foo"] = 1
... print foo
...
 >>> foo()


 >>> def foo():
... foo = 1
... locals()["foo"] = 2
... print foo
...
 >>> foo()
1



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


"Canonical" way of deleting elements from lists

2008-01-09 Thread Robert Latest
Hello,

>From a list of strings I want to delete all empty ones. This works:

while '' in keywords: keywords.remove('')

However, to a long-term C programmer this looks like an awkward way of 
accomplishing a simple goal, because the list will have to be re-evaluated 
in each iteration. Is there a way to just walk the list once and throw out 
unwanted elements as one goes along?

I started programming back when such little things were real performance 
issues, so I have some sort of cringe reflex when something looks 
inefficient.

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


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Fredrik Lundh
Robert Latest wrote:
>>From a list of strings I want to delete all empty ones. This works:
> 
> while '' in keywords: keywords.remove('')
> 
> However, to a long-term C programmer this looks like an awkward way of 
> accomplishing a simple goal, because the list will have to be re-evaluated 
> in each iteration.

you're using a quadratic algorihm ("in" is a linear search, and remove 
has to move everything around for each call), and you're worried about
the time it takes Python to fetch a variable?

 > Is there a way to just walk the list once and throw out unwanted
 > elements as one goes along?

creating a new list is always almost the right way to do things like 
this.  in this specific case, filter() or list comprehensions are good 
choices:

keywords = filter(None, keywords) # get "true" items only

keywords = [k for k in keywords if k]

also see:

http://effbot.org/zone/python-list.htm#modifying



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


Re: Open a List of Files

2008-01-09 Thread Paul Hankin
On Jan 9, 10:02 am, Fredrik Lundh <[EMAIL PROTECTED]> wrote:
> Paul Hankin wrote:
> > This can be more cleanly written using locals()
>
> > for fn in filenames:
> > locals()[fn] = open(os.path.join(host_path, fname + '.txt', 'wb')
>
> from the reference manual:
>
>  locals()
>
>  Update and return a dictionary representing the current
>  local symbol table.
>
>  Warning: The contents of this dictionary should not be
>  modified; changes may not affect the values of local
>  variables used by the interpreter.

Thanks Fredrik! I learnt something today.

I wonder if there's a reason why it doesn't raise an exception when
you try to write to it? That would seem better to me than having it
sometimes update variables and sometimes not.

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


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Fredrik Lundh
Fredrik Lundh wrote:

> creating a new list is always almost the right way to do things like 

message = message.replace("always almost", "almost always")

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


alternating string replace

2008-01-09 Thread cesco
Hi,

say I have a string like the following:
s1 = 'hi_cat_bye_dog'
and I want to replace the even '_' with ':' and the odd '_' with ','
so that I get a new string like the following:
s2 = 'hi:cat,bye:dog'
Is there a common recipe to accomplish that? I can't come up with any
solution...

Thanks in advance
Cesco
-- 
http://mail.python.org/mailman/listinfo/python-list


Multi form CGI examples?

2008-01-09 Thread rodmc
Hi,

I have been looking online for some examples of how to create multi
form CGI scripts using Python. I have come across a few but am still a
little confused - being new to CGI on Python. Can anyone provide me
with some pointers to useful tutorials or advice on the best way to go
about it? I think I have mastered the basic elements of parsing and
processing single forms so it is really a matter of architecture and
examples more than anything else. For example should I write
everything in one file or split it up over several, also should I use
HTML files or hard code the HTML in the script?

As for the actual forms, there will probably be three of them. Each
will have some elements which are required. Other aspects include the
ability to upload files and check whether the person is logged in
(probably via cookies although the people who operate the site have
yet to get back to me).

These are all kind of newbie questions when it comes to CGI, but not
being a web developer tips and advice are appreciated. I would rather
avoid costly mistakes!

Thanks in advance.

Kind regards,

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


Re: Open a List of Files

2008-01-09 Thread Fredrik Lundh
Paul Hankin wrote:

> Thanks Fredrik! I learnt something today.
> 
> I wonder if there's a reason why it doesn't raise an exception when
> you try to write to it? That would seem better to me than having it
> sometimes update variables and sometimes not.

probably because it returns a standard dictionary object, and Python's 
dictionary objects are writable.

(and if someone wants to reopen the old discussion about how Python 
absolutely definitely needs frozen dictionaries to be useful at all, 
please do so in a new thread ;-)



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


Re: alternating string replace

2008-01-09 Thread Fredrik Lundh
cesco wrote:

> and I want to replace the even '_' with ':' and the odd '_' with ','
> so that I get a new string like the following:
> s2 = 'hi:cat,bye:dog'
> Is there a common recipe to accomplish that? I can't come up with any
> solution...

how about splitting on "_", joining pairs with ":", and finally joining 
the result with "," ?

 >>> s1 = "hi_cat_bye_dog"
 >>> s1 = s1.split("_")
 >>> s1
['hi', 'cat', 'bye', 'dog']
 >>> s1 = [s1[i]+":"+s1[i+1] for i in range(0,len(s1),2)]
 >>> s1
['hi:cat', 'bye:dog']
 >>> s1 = ",".join(s1)
 >>> s1
'hi:cat,bye:dog'

(there are many other ways to do it, but the above 3-liner is short and 
straightforward.  note the use of range() to step over every other item 
in the list)



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


Re: how to open a file in some application using Tkinter i am using TKINTER to create GUI application i want to know how to open a word document in open office or any other applicatio

2008-01-09 Thread Paul Boddie
On 9 Jan, 09:24, Fredrik Lundh <[EMAIL PROTECTED]> wrote:
>

[Opening files in applications]

> on windows, you can use the "os.startfile" function:
>
>   import os
>   os.startfile("mydocument.doc")
>
> (this is the same as double-clicking on a document in the file explorer)
>
> on other platforms, use os.system() and specify what application to run:
>
>   import os
>   os.system("someapp mydocument.doc")

Or try the desktop module which uses os.startfile on Windows, but
employs mechanisms appropriate for other desktop environments
elsewhere:

  http://www.python.org/pypi/desktop

This code should do the trick:

  import desktop
  desktop.open("mydocument.doc")

This assumes that your desktop environment knows how to handle .doc
files, of course.

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


Re: alternating string replace

2008-01-09 Thread cokofreedom
On Jan 9, 11:34 am, cesco <[EMAIL PROTECTED]> wrote:
> Hi,
>
> say I have a string like the following:
> s1 = 'hi_cat_bye_dog'
> and I want to replace the even '_' with ':' and the odd '_' with ','
> so that I get a new string like the following:
> s2 = 'hi:cat,bye:dog'
> Is there a common recipe to accomplish that? I can't come up with any
> solution...
>
> Thanks in advance
> Cesco

For replacing every other one, I tend to use the modulo, with a
counter.

count = (if u want even start with 0 else do 1)

while/for replacing /in lalastring:
  if count % 2 == 0:
do even
  else:
do odd
  count += 1

This is a rather basic way of doing it, and I am sure people will sure
much more efficient ways, but it generally works for me.

Though I am now wondering if count % 2 when count == 2 is true or
false as it returns 0

Of course you still need to do your replace but you should be able to
do that.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Hrvoje Niksic
Robert Latest <[EMAIL PROTECTED]> writes:

> From a list of strings I want to delete all empty ones. This works:
>
> while '' in keywords: keywords.remove('')

If you're looking for a quick (no quadratic behavior) and convenient
way to do it, you can do it like this:

keywords = [s for s in keywords if s != '']

But that creates a new list, which might not be wanted for long lists
with few empty elements (or for shared lists).  It also iterates over
every list element in a Python loop, which can take some time for long
lists.

> Is there a way to just walk the list once and throw out unwanted
> elements as one goes along?

I'd do it like this:

i = 0
while 1:
try:
i = keywords.index('', i)
except ValueError:
break
del keywords[i]

Or even:

try:
i = 0
while 1:
i = keywords.index('', i)  # throws ValueError and stops the loop
del keywords[i]
except ValueError:
pass

In both cases the search for the empty string is done in efficient C
code, and you only loop in Python over the actual matches.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Hrvoje Niksic
Hrvoje Niksic <[EMAIL PROTECTED]> writes:

> If you're looking for a quick (no quadratic behavior) and convenient
> way to do it, you can do it like this:
>
> keywords = [s for s in keywords if s != '']

It now occurred to me that a good compromise between convenience and
efficiency that retains the same list is:

keywords[:] = (s for s in keywords if s)
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Robert Latest
Fredrik Lundh wrote:

> keywords = filter(None, keywords) # get "true" items only

Makes seinse. BTW, where can I find all methods of the built-in types? 
Section 3.6 only talks about strings and mentions the list append() method 
only in an example. Am I too stupid to read the manual, or is this an 
omission?

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


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Robert Latest
Hrvoje Niksic wrote:

> keywords[:] = (s for s in keywords if s)

Looks good but is so far beyond my own comprehension that I don't dare 
include it in my code ;-)

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


Re: alternating string replace

2008-01-09 Thread Peter Otten
cesco wrote:

> say I have a string like the following: s1 = 'hi_cat_bye_dog'
> and I want to replace the even '_' with ':' and the odd '_' with ',' so
> that I get a new string like the following: s2 = 'hi:cat,bye:dog'

>>> import re
>>> from itertools import cycle
>>> re.sub("_", lambda m, c=cycle(":,").next: c(), "hi_cat_bye_dog")
'hi:cat,bye:dog'
 
> Is there a common recipe to accomplish that? I can't come up with any
> solution...

There are many. If you want to learn Python don't be afraid to write it
in a long-winded way (with loops and helper functions) first.

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


Learning Python via a little word frequency program

2008-01-09 Thread Andrew Savige
I'm learning Python by reading David Beazley's "Python Essential Reference"
book and writing a few toy programs. To get a feel for hashes and sorting,
I set myself this little problem today (not homework, BTW):

  Given a string containing a space-separated list of names:

names = "freddy fred bill jock kevin andrew kevin kevin jock"

  produce a frequency table of names, sorted descending by frequency.
  then ascending by name. For the above data, the output should be:

kevin : 3
jock  : 2
andrew: 1
bill  : 1
fred  : 1
freddy: 1

Here's my first attempt:

names = "freddy fred bill jock kevin andrew kevin kevin jock"
freq = {}
for name in names.split():
freq[name] = 1 + freq.get(name, 0)
deco = zip([-x for x in freq.values()], freq.keys())
deco.sort()
for v, k in deco:
print "%-10s: %d" % (k, -v)

I'm interested to learn how more experienced Python folks would solve
this little problem. Though I've read about the DSU Python sorting idiom,
I'm not sure I've strictly applied it above ... and the -x hack above to
achieve a descending sort feels a bit odd to me, though I couldn't think
of a better way to do it.

I also have a few specific questions. Instead of:

for name in names.split():
freq[name] = 1 + freq.get(name, 0)

I might try:

for name in names.split():
try:
freq[name] += 1
except KeyError:
freq[name] = 1

Which is preferred?

Ditto for:

deco = zip([-x for x in freq.values()], freq.keys())

versus:

deco = zip(map(operator.neg, freq.values()), freq.keys())

Finally, I might replace:

for v, k in deco:
print "%-10s: %d" % (k, -v)

with:

print "\n".join("%-10s: %d" % (k, -v) for v, k in deco)

Any feedback on good Python style, performance tips, good books
to read, etc. is appreciated.

Thanks,
/-\


  Make the switch to the world's best email. Get the new Yahoo!7 Mail now. 
www.yahoo7.com.au/worldsbestemail


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


Re: Learning Python via a little word frequency program

2008-01-09 Thread Fredrik Lundh
Andrew Savige wrote:


> Here's my first attempt:
> 
> names = "freddy fred bill jock kevin andrew kevin kevin jock"
> freq = {}
> for name in names.split():
> freq[name] = 1 + freq.get(name, 0)
> deco = zip([-x for x in freq.values()], freq.keys())
> deco.sort()
> for v, k in deco:
> print "%-10s: %d" % (k, -v)
> 
> I'm interested to learn how more experienced Python folks would solve
> this little problem. Though I've read about the DSU Python sorting idiom,
> I'm not sure I've strictly applied it above ... and the -x hack above to
> achieve a descending sort feels a bit odd to me, though I couldn't think
> of a better way to do it.

sort takes a reverse flag in recent versions, so you can do a reverse 
sort as:

deco.sort(reverse=True)

in older versions, just do:

deco.sort()
deco.reverse() # this is fast!

also note that recent versions also provide a "sorted" function that 
returns the sorted list, and both "sort" and "sorted" now allow you to 
pass in a "key" function that's used to generate a sort key for each 
item.  taking that into account, you can simply write:

# sort items on descending count
deco = sorted(freq.items(), key=lambda x: -x[1])

simplifying the print statement is left as an exercise.

> I also have a few specific questions. Instead of:
> 
> for name in names.split():
> freq[name] = 1 + freq.get(name, 0)
> 
> I might try:
> 
> for name in names.split():
> try:
> freq[name] += 1
> except KeyError:
> freq[name] = 1
> 
> Which is preferred?

for simple scripts and small datasets, always the former.

for performance-critical production code, it depends on how often you 
expect "name" to be present in the dictionary (setting up a try/except 
is cheap, but raising and catching one is relatively costly).

> Ditto for:
> 
> deco = zip([-x for x in freq.values()], freq.keys())
> 
> versus:
> 
> deco = zip(map(operator.neg, freq.values()), freq.keys())

using zip/keys/values to emulate items is a bit questionable.  if you 
need to restructure the contents of a dictionary, I usually prefer items 
(or iteritems, where suitable) and tuple indexing/unpacking in a list 
comprehension (or generator expression, where suitable).

> Finally, I might replace:
> 
> for v, k in deco:
> print "%-10s: %d" % (k, -v)
> 
> with:
> 
> print "\n".join("%-10s: %d" % (k, -v) for v, k in deco)

why?



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


Update of Gnuplot.py

2008-01-09 Thread Tom La Bone

Can someone suggest where to get a version of Gnuplot.py (for Windows) that
has been updated to use numpy? Or, is there another interface available to
use GnuPlot from Python? 

Thanks.

Tom
-- 
View this message in context: 
http://www.nabble.com/Update-of-Gnuplot.py-tp14710180p14710180.html
Sent from the Python - python-list mailing list archive at Nabble.com.

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


Re: Learning Python via a little word frequency program

2008-01-09 Thread Ant
> I'm interested to learn how more experienced Python folks would solve
> this little problem.

I think I'd do the following:

from collections import defaultdict

names = "freddy fred bill jock kevin andrew kevin kevin jock"
freq = defaultdict(lambda: 0)

for name in names.split():
freq[name] += 1

pairs = [(v, k) for k, v in freq.iteritems()]

for v, k in reversed(sorted(pairs)):
print "%-10s: %d" % (k, v)


defaultdict makes the frequency accumulation neater.

reversed(sorted(pairs)) avoids the little -v hack and makes it more
obvious what you are doing. Of course this could also be achieved by
doing pairs.sort() and pairs.reverse() before iterating over the pairs
list.

Cheers,

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


Re: How a smart editor could make "Postfix type declarations PEP3117" in Python3000 more readable

2008-01-09 Thread Bruno Desthuilliers
aspineux a écrit :
> Hi
> 
> I read the PEP 3117 about the new "Postfix type declarations"  in
> Python3000.
> THIS PEP as been REJECTED ! 

Indeed - it's an april's fool joke !-)

And BTW, no need to scream, we hear you pretty well.

> But ...
> 
> The notation in the PEP is very ugly !  This make python code more
> difficult to read!
> 
> Anyway when I switched to python (from C, C++, ..), I suffered a lot
> of the
> untyped python variables.
> And I think this is a good idea to include
> typing in python.

The concept of "type" greatly differs between static typing and dynamic 
typing. FWIW, it also somewhat differs between declarative static type 
systems (C/C++/Java/etc) and inference-based static type systems (OCaml, 
Haskell etc).

Anyway, Python is dynamically typed (FWIW, it's dynamic almost 
everywhere), and this is probably not going to change in a foreseeable 
future. So I guess you'd better learn to use dynamic typing instead of 
trying to write C++ in Python - or, if you just can't get used to 
dynamic typing, use another language.

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


Re: Learning Python via a little word frequency program

2008-01-09 Thread Peter Otten
Andrew Savige wrote:

> I'm learning Python by reading David Beazley's "Python Essential
> Reference" book and writing a few toy programs. To get a feel for hashes
> and sorting, I set myself this little problem today (not homework, BTW):
> 
>   Given a string containing a space-separated list of names:
> 
> names = "freddy fred bill jock kevin andrew kevin kevin jock"
> 
>   produce a frequency table of names, sorted descending by frequency.
>   then ascending by name. For the above data, the output should be:
> 
> kevin : 3
> jock  : 2
> andrew: 1
> bill  : 1
> fred  : 1
> freddy: 1
> 
> Here's my first attempt:
> 
> names = "freddy fred bill jock kevin andrew kevin kevin jock" freq = {}
> for name in names.split():
> freq[name] = 1 + freq.get(name, 0)
> deco = zip([-x for x in freq.values()], freq.keys()) deco.sort() for v,
> k in deco:
> print "%-10s: %d" % (k, -v)
> 
> I'm interested to learn how more experienced Python folks would solve
> this little problem. Though I've read about the DSU Python sorting
> idiom, I'm not sure I've strictly applied it above ... and the -x hack
> above to achieve a descending sort feels a bit odd to me, though I
> couldn't think of a better way to do it.

You can specify a reverse sort with

deco.sort(reverse=True)

Newer versions of Python have the whole idiom built in:

>>> items = freq.items()
>>> from operator import itemgetter
>>> items.sort(key=itemgetter(1), reverse=True) 
>>> for item in items:
... print "%-10s: %d" % item
...
kevin : 3
jock  : 2
bill  : 1
andrew: 1
fred  : 1
freddy: 1

You can pass an arbitrary function as key. itemgetter(1) is equivalent to

def key(item): return item[1]
 
> I also have a few specific questions. Instead of:
> 
> for name in names.split():
> freq[name] = 1 + freq.get(name, 0)
> 
> I might try:
> 
> for name in names.split():
> try:
> freq[name] += 1
> except KeyError:
> freq[name] = 1
> 
> Which is preferred?

I have no strong opinion about that. Generally speaking try...except is
faster when you have many hits, i. e. the except suite is rarely invoked.
Starting with Python 2.5 you can alternatively use

from collections import defaultdict
freq = defaultdict(int)
for name in names.split():
freq[name] += 1
 
> Ditto for:
> 
> deco = zip([-x for x in freq.values()], freq.keys())
> 
> versus:
> 
> deco = zip(map(operator.neg, freq.values()), freq.keys())

I think the list comprehension is slightly more readable.

> Finally, I might replace:
> 
> for v, k in deco:
> print "%-10s: %d" % (k, -v)
> 
> with:
> 
> print "\n".join("%-10s: %d" % (k, -v) for v, k in deco)

Again, I find the explicit for loop more readable, but sometimes use the
genexp, too.

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


Re: alternating string replace

2008-01-09 Thread Duncan Booth
cesco <[EMAIL PROTECTED]> wrote:

> Hi,
> 
> say I have a string like the following:
> s1 = 'hi_cat_bye_dog'
> and I want to replace the even '_' with ':' and the odd '_' with ','
> so that I get a new string like the following:
> s2 = 'hi:cat,bye:dog'
> Is there a common recipe to accomplish that? I can't come up with any
> solution...
> 
Here's yet another answer:

from itertools import islice, cycle

def interleave(*iterators):
iterators = [ iter(i) for i in iterators ]
while 1:
for i in iterators:
yield i.next()


def punctuate(s):
parts = s.split('_')
punctuation = islice(cycle(':,'), len(parts)-1)
return ''.join(interleave(parts, punctuation))

s1 = 'hi_cat_bye_dog'
print punctuate(s1)


# Or as a one-liner (once you have interleave):

print ''.join(list(interleave(s1.split('_'), cycle(':,')))[:-1])
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: how to get string printed by PyErr_Print( )?

2008-01-09 Thread grbgooglefan
On Dec 19 2007, 5:55 pm, Christian Heimes <[EMAIL PROTECTED]> wrote:
> grbgooglefan wrote:
> > PythonC API functionPyErr_Print( ) prints an error string onto stderr
> > if PyErr_Occurred() is true.
> > I don't want to print this to stderr because my Python+C code is
> > running daemon mode & won't have terminal / stderr.
> > So, I want to retrieve the string whichPyErr_Print( ) will print.
> > E.g.,PyErr_Print() printed following string when I tried to call
> > setTuple with one extra argument
> > Traceback (most recent call last):
> >   File "", line 2, in isTacticSafe
> > IndexError: tuple assignment index out of range
>
> I suggest a different approach. A daemon must have a stdin, stdout and
> stderr connected to a terminal. You can use freopen() to redirect stderr
> and stdout to a log file and fclose() to close stdin.
>
> http://www.gnu.org/software/libc/manual/html_mono/libc.html#Opening-S...
>
> Christian

I do not want to redirect anything to file. Because I do not want to
avoid the disk access completely - for reading as well as writing.
I liked the 1st option suggested by Robert Kern.

Can you please explain a little bit how can I replace sys.stderr with
StringIO or my char* buffer?
I have to show the error message of Python code compilation &
execution to the user on the GUI & therefore I want to capture the
error message directly instead of logging it to file.

Thanks in advance for all your help.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Learning Python via a little word frequency program

2008-01-09 Thread Andrew Savige
Fredrik Lundh wrote:

># sort items on descending count
>deco = sorted(freq.items(), key=lambda x: -x[1])

Neat. Is there any way to use sorted() with multiple sort keys? ...
Given that the spec calls for sorting by _two_ keys: first by
frequency (descending), then by name (ascending). To clarify:

kevin : 3
jock  : 2
andrew: 1
bill  : 1
fred  : 1
freddy: 1

is correct, while:

kevin : 3
jock  : 2
bill  : 1
andrew: 1
fred  : 1
freddy: 1

is incorrect because "andrew 1" must appear before "bill 1".

>> Finally, I might replace:
>> 
>> for v, k in deco:
>>print "%-10s: %d" % (k, -v)
>> 
>> with:
>> 
>> print "\n".join("%-10s: %d" % (k, -v) for v, k in deco)
>
> why?

No good reason, unless performance is significantly different.
The first seems clearer to me. Just wondering what other folks think.

Thanks,
/-\


  Make the switch to the world's best email. Get the new Yahoo!7 Mail now. 
www.yahoo7.com.au/worldsbestemail


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


Re: Learning Python via a little word frequency program

2008-01-09 Thread Fredrik Lundh
Andrew Savige wrote:

> Neat. Is there any way to use sorted() with multiple sort keys? ...

sure!  just return the "composite key" as a tuple:

# sort on descending count, ascending name
deco = sorted(freq.items(), key=lambda x: (-x[1], x[0]))

(when comparing tuples, Python first compares the first item from each 
tuple.  if they're equal, it continues with the second item, and so on).



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


Re: I'm searching for Python style guidelines

2008-01-09 Thread MartinRinehart


Matthew Woodcraft wrote:
> I think [the olpc guidlines are] mostly PEP 8, with some notes added.

Took a good look. You are absolutely correct.

PEP 8 is basically word processing text stuck between  and 
tags. OLPC is Wiki HTML. Good example of how the latter is a lot
bigger than the former, with little extra content.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Learning Python via a little word frequency program

2008-01-09 Thread Bruno Desthuilliers
Andrew Savige a écrit :
> I'm learning Python by reading David Beazley's "Python Essential Reference"
> book and writing a few toy programs. To get a feel for hashes and sorting,
> I set myself this little problem today (not homework, BTW):
> 
>   Given a string containing a space-separated list of names:
> 
> names = "freddy fred bill jock kevin andrew kevin kevin jock"
> 
>   produce a frequency table of names, sorted descending by frequency.
>   then ascending by name. For the above data, the output should be:
> 
> kevin : 3
> jock  : 2
> andrew: 1
> bill  : 1
> fred  : 1
> freddy: 1
> 
> Here's my first attempt:
> 
> names = "freddy fred bill jock kevin andrew kevin kevin jock"
> freq = {}
> for name in names.split():
> freq[name] = 1 + freq.get(name, 0)
> deco = zip([-x for x in freq.values()], freq.keys())
> deco.sort()
> for v, k in deco:
> print "%-10s: %d" % (k, -v)
> 
> I'm interested to learn how more experienced Python folks would solve
> this little problem. 

For a one-shot Q&D script:

names = "freddy fred bill jock kevin andrew kevin kevin jock"
freqs = [(- names.count(name), name) for name in set(names.split())]
print "\n".join("%-10s : %s" % (n, -f) for f, n in sorted(freqs))


Now I might choose a very different solution for a more serious 
application, depending on detailed specs and intended use of the 
"frequency table".

> Though I've read about the DSU Python sorting idiom,
> I'm not sure I've strictly applied it above ... 

Perhaps not "strictly" since you don't really "undecorate", but that's 
another application of the same principle : provided the appropriate 
data structure, sort() (or sorted()) will do the right thing.


> and the -x hack above to
> achieve a descending sort feels a bit odd to me, though I couldn't think
> of a better way to do it.

The "other" way would be to pass a custom comparison callback to sort, 
which would be both slower and more complicated. Your solution is IMHO 
the right thing to do here.

> I also have a few specific questions. Instead of:
> 
> for name in names.split():
> freq[name] = 1 + freq.get(name, 0)
> 
> I might try:
> 
> for name in names.split():
> try:
> freq[name] += 1
> except KeyError:
> freq[name] = 1

or a couple other solutions, including a defaultdict (python >= 2.5).

> Which is preferred?

It's a FAQ - or it should be one. Globally: the second one tends to be 
faster when there's no exception (ie the key already exists), but slower 
when exceptions happen. So it mostly depends on what you expect your 
dataset to be.

Now note that you don't necessarily need a dict here !-)

> Ditto for:
> 
> deco = zip([-x for x in freq.values()], freq.keys())
> 
> versus:
> 
> deco = zip(map(operator.neg, freq.values()), freq.keys())

As far as I'm concerned, I'd favor the first solution here. Reads better 
IMHO

> Finally, I might replace:
> 
> for v, k in deco:
> print "%-10s: %d" % (k, -v)
> 
> with:
> 
> print "\n".join("%-10s: %d" % (k, -v) for v, k in deco)

That's what I'd do here too - but it depends on context (ie: for huge 
datasets and/or complex formating, i'd use a for loop).

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

Re: Learning Python via a little word frequency program

2008-01-09 Thread Peter Otten
Andrew Savige wrote:

> Fredrik Lundh wrote:
> 
>># sort items on descending count
>>deco = sorted(freq.items(), key=lambda x: -x[1])
> 
> Neat. Is there any way to use sorted() with multiple sort keys? ...
> Given that the spec calls for sorting by _two_ keys: first by
> frequency (descending), then by name (ascending). To clarify:
> 
> kevin : 3
> jock  : 2
> andrew: 1
> bill  : 1
> fred  : 1
> freddy: 1
> 
> is correct, while:
> 
> kevin : 3
> jock  : 2
> bill  : 1
> andrew: 1
> fred  : 1
> freddy: 1
> 
> is incorrect because "andrew 1" must appear before "bill 1".

You can sort twice (on the name, then on the number) or use a more complex
key:

>>> for n, v in sorted(freq.items(), key=lambda (n, v): (-v, n)):
... print n, v
... 
kevin 3
jock 2
andrew 1
bill 1
fred 1
freddy 1

>>> items = freq.items()
>>> items.sort(key=itemgetter(0))
>>> items.sort(key=itemgetter(1), reverse=True)
>>> for n, v in items:
... print n, v
... 
kevin 3
jock 2
andrew 1
bill 1
fred 1
freddy 1

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


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread bearophileHUGS
Robert Latest:
> Fredrik Lundh wrote:
> > keywords = filter(None, keywords) # get "true" items only
>
> Makes seinse. BTW, where can I find all methods of the built-in types?
> Section 3.6 only talks about strings and mentions the list append() method
> only in an example. Am I too stupid to read the manual, or is this an
> omission?

filter isn't a method of list, it's a free function.

For most situations that solution with filter(None,keywords) is good
enough (but it filters away all false items, so it filters away None,
0, empty things, etc, too).
The following one is an in-place version (it may be faster with
Psyco), but you usually don't need it:


def inplacefilter(pred, alist):
"""inplacefilter(pred, alist): filters the given list like
filter(),
but works inplace, minimizing the used memory. It returns None.

>>> pr = lambda x: x > 2
>>> l = []
>>> inplacefilter(pr, l)
>>> l
[]
>>> l = [1,2,2]
>>> inplacefilter(pr, l)
>>> l
[]
>>> l = [3]
>>> inplacefilter(pr, l)
>>> l
[3]
>>> l = [1,2,3,1,5,1,6,0]
>>> r = filter(pr, l) # normal filter
>>> r
[3, 5, 6]
>>> inplacefilter(pr, l)
>>> r == l
True
"""
slow = 0
for fast, item in enumerate(alist):
if pred(item):
if slow != fast:
alist[slow] = alist[fast]
slow += 1
del alist[slow:]


You may want to avoid the enumerate() too if you use Psyco and you
need max speed.

Bye,
bearophile
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: alternating string replace

2008-01-09 Thread bearophileHUGS
My version, uses a re.sub, plus a function used as an object with a
one bit state:

from re import sub

def repl(o):
repl.n = not repl.n
return ":" if repl.n else ","
repl.n = False

print sub("_", repl, "hi_cat_bye_dog_foo_bar_red")

Bye,
bearophile
-- 
http://mail.python.org/mailman/listinfo/python-list


How does unicode() work?

2008-01-09 Thread Robert Latest
Here's a test snippet...

import sys
for k in sys.stdin:
print '%s -> %s' % (k, k.decode('iso-8859-1'))

...but it barfs when actually fed with iso8859-1 characters. How is this 
done right?

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


Re: stupid/style/list question

2008-01-09 Thread bearophileHUGS
Duncan Booth:
> I tried to measure this with timeit, and it looks like the 'del' is
> actually quite a bit faster (which I find suprising).

Yes, it was usually faster in my benchmarks too. Something similar is
true for dicts too. I think such timings are influenced a lot by the
garbage collector.

Bye,
bearophile
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How does unicode() work?

2008-01-09 Thread Fredrik Lundh
Robert Latest wrote:

> Here's a test snippet...
> 
> import sys
> for k in sys.stdin:
> print '%s -> %s' % (k, k.decode('iso-8859-1'))
> 
> ...but it barfs when actually fed with iso8859-1 characters. How is this 
> done right?

it's '%s -> %s' % (byte string, unicode string) that barfs.  try doing

import sys
for k in sys.stdin:
 print '%s -> %s' % (repr(k), k.decode('iso-8859-1'))

instead, to see what's going on.



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


Re: How does unicode() work?

2008-01-09 Thread Robert Latest
Robert Latest wrote:
> ...but it barfs when actually fed with iso8859-1 characters.

Specifically, it says:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xf6 in position 0: 
ordinal not in range(128)

which doesn't make sense to me, because I specifically asked for the 
iso8859-1 decoder, not the 'ascii' one.

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


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Nick Craig-Wood
Robert Latest <[EMAIL PROTECTED]> wrote:
>  Hrvoje Niksic wrote:
> 
> > keywords[:] = (s for s in keywords if s)
> 
>  Looks good but is so far beyond my own comprehension that I don't dare 
>  include it in my code ;-)

:-)  Worth understanding thought I think - here are some hints

  keywords[:] = (s for s in keywords if s)

is equivalent to this (but without creating a temporary list)

  keywords[:] = list(s for s in keywords if s)

which is equivalent to

  keywords[:] = [s for s in keywords if s]

This

  keywords[:] = 

Replaces the contents of the keywords list rather than making a new
list.

Here is a demonstration of the fundamental difference

  >>> a=[1,2,3,4]
  >>> b=a
  >>> a=[5,6,7]
  >>> print a, b
  [5, 6, 7] [1, 2, 3, 4]

  >>> a=[1,2,3,4]
  >>> b=a
  >>> a[:]=[5,6,7]
  >>> print a, b
  [5, 6, 7] [5, 6, 7]

Using keywords[:] stops the creation of another temporary list.  The
other behaviour may or may not be what you want!

-- 
Nick Craig-Wood <[EMAIL PROTECTED]> -- http://www.craig-wood.com/nick
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Learning Python via a little word frequency program

2008-01-09 Thread Bruno Desthuilliers
Ant a écrit :
>> I'm interested to learn how more experienced Python folks would solve
>> this little problem.
> 
> I think I'd do the following:
> 
> from collections import defaultdict
> 
> names = "freddy fred bill jock kevin andrew kevin kevin jock"
> freq = defaultdict(lambda: 0)
> 
> for name in names.split():
> freq[name] += 1
> 
> pairs = [(v, k) for k, v in freq.iteritems()]
> 
> for v, k in reversed(sorted(pairs)):
> print "%-10s: %d" % (k, v)
> 
> 
> defaultdict makes the frequency accumulation neater.
> 
> reversed(sorted(pairs)) avoids the little -v hack and makes it more
> obvious what you are doing.

But fails to implement the specs (emphasis is mine):
"""
   produce a frequency table of names, sorted descending by frequency.
   *then ascending by name*. For the above data, the output should be:

 kevin : 3
 jock  : 2
 andrew: 1
 bill  : 1
 fred  : 1
 freddy: 1
"""

With your solution, you get:

kevin : 3
jock  : 2
freddy: 1
fred  : 1
bill  : 1
andrew: 1


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


Re: Collecting Rich Data Structures for students

2008-01-09 Thread bearophileHUGS
It may be better to keep the data in a simpler form:

data = """\
42 40 73 45 Albany, N.Y.
35 5 106 39 Albuquerque, N.M.
35 11 101 50 Amarillo, Tex.
34 14 77 57 Wilmington, N.C.
49 54 97 7 Winnipeg, Man., Can."""

cities = {}
for line in data.splitlines():
a1, a2, a3, a4, n = line.split(" ", 4)
cities[n] = [(int(a1), int(a2), "N"), (int(a3), int(a4), "W")]
print cities

Bye,
bearophile
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Fredrik Lundh
Nick Craig-Wood wrote:

> Using keywords[:] stops the creation of another temporary list.

in CPython, "list[:] = iter" actually creates a temporary list object on 
the inside, in case "iter" isn't already a list or a tuple.

(see the implementation of PySequence_Fast() for details).



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


Problem in the program flow...please help?

2008-01-09 Thread jatin patni
I am making a python application with a GUI using WXGlade which connects to
a website and extracts some information, this takes around 5-20 seconds of
time per website.

I have a button(GUI) which when clicked, calls a function connect( ) which
takes around 5-20 seconds to complete(As I mentioned Earlier)
The problem is, during this time the other part of the code is rendered
useless, I cannot access other parts of the code, for example a cancel( )
function to be called when cancel button is pressed, cannot be pressed until
the previous function is completed and moreover the GUI hangs(stops
responding).

I am planning to explore Threading and Asynchronous data transfer, next.
Please help me out if anyone has had a similar experience in the past.

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

PIL question

2008-01-09 Thread Alex K
Hello,

Would anyone know how to generate thumbnails with rounded corners
using PIL? I'm also considering imagemagick if PIL turns out not to be
appropriate for the task.

Thank you so much,

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


Re: Collecting Rich Data Structures for students

2008-01-09 Thread Fredrik Lundh
[EMAIL PROTECTED] wrote:

> Some have offered XML repositories, which I can well
> understand, but in this case we're looking specifically for
> legal Python modules (py files), although they don't have
> to be Latin-1 (e.g. the sushi types file might not have a
> lot of romanji).

you can of course convert any XML file to legal Python code simply by 
prepending

 from xml.etree.ElementTree import XML
 data = XML("""

and appending

 """)

and then using the ET API to navigate the data, but I guess that's not 
what you had in mind.



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


Re: alternating string replace

2008-01-09 Thread cokofreedom
Designed a pretty basic way that is "acceptable" on small strings.

evenOrOdd = True
s1 = "hi_cat_bye_dog_foo_bar_red"
s2 = ""

for i in s1:
if i == '_':
if evenOrOdd:
s2 += ':'
evenOrOdd = not evenOrOdd
else:
s2 +=  ','
evenOrOdd = not evenOrOdd
else:
s2 += i

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


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Sion Arrowsmith
Robert Latest  <[EMAIL PROTECTED]> wrote:
> BTW, where can I find all methods of the built-in types? 
>Section 3.6 only talks about strings and mentions the list append() method 
>only in an example. Am I too stupid to read the manual, or is this an 
>omission?

3.6 talks about features common to all "sequence" types. Strings
are discussed specifically in 3.6.1 ("String Methods"). Lists are
similarly discussed in 3.6.4 ("Mutable Sequence Types"). They are
certainly not omitted, although maybe the title of 3.6.4 could be
take a leaf from the Zen and be more explicit.

-- 
\S -- [EMAIL PROTECTED] -- http://www.chaos.org.uk/~sion/
   "Frankly I have no feelings towards penguins one way or the other"
-- Arthur C. Clarke
   her nu becomeþ se bera eadward ofdun hlæddre heafdes bæce bump bump bump
-- 
http://mail.python.org/mailman/listinfo/python-list

flatten sequences in a dictionary

2008-01-09 Thread ajcppmod
Hi

I wondering if someone could give me a pointer. I have a dictionary
with the following structure:

testDict = dict(foo=((1,2,3),(1,4,3)), bar=((3,2,1),(9,8,7,)),
mumble=((1,2,3),))

I am trying to create a list of the the 3 element tuples using
itertools (just for a bit of fun). I'm trying this:

list(itertools.chain(testDict.itervalues())

but that's doesn't work. I think I need a way to convert the iterator
returned by itervalues() into a sequence of iterables. Any clues?

Thanks

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


Re: flatten sequences in a dictionary

2008-01-09 Thread Paul Hankin
On Jan 9, 1:16 pm, [EMAIL PROTECTED] wrote:
> Hi
>
> I wondering if someone could give me a pointer. I have a dictionary
> with the following structure:
>
> testDict = dict(foo=((1,2,3),(1,4,3)), bar=((3,2,1),(9,8,7,)),
> mumble=((1,2,3),))
>
> I am trying to create a list of the the 3 element tuples using
> itertools (just for a bit of fun). I'm trying this:
>
> list(itertools.chain(testDict.itervalues())

Close! Try:
list(itertools.chain(*testDict.itervalues())

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


Re: Newbie question: Classes

2008-01-09 Thread Sam Garson
OK i've kind of got that. The only thing left is calling the class.

"
class Remember:

def __init__(self, master):

self.ent = Entry(self, ...

root = Tk()

app = Remember(root)
"
I get the error "Remember instance has no attribute 'tk' "...???




On Jan 8, 2008 7:36 PM, Sam Garson <[EMAIL PROTECTED] > wrote:

> Hello all
>
> Basically, I have created a program using tkinter without using any class
> structure, simply creating widgets and functions (and finding ways around
> passing variables from function to function, using global variables etc).
> The program has become rather large ( lines?) I am trying to now put it into
> a class structure, because I hear it is easier to handle.
>
> So basically, I put all the stuff into a class, making the widgets in the
> "def __init__(self, root)" (root being my Tk() ) and then I have had to put
> a "self." in front of any instance of any variable or widget. Is this right?
> it seems like nothing is any easier (except having variables locally). Is
> this right? Should I be creating more classes for different things or what?
>
> I can upload the .py if you want.
>
> Thanks,
>
> Sam
>
> --
> I intend to live forever - so far, so good.
>
> SaM




-- 
I intend to live forever - so far, so good.

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

Re: Python's great, in a word

2008-01-09 Thread MartinRinehart
Thanks to all for many helpful suggestions.

Python, by the way, is verbose when compared to APL. (See
http://catpad.net/michael/apl/ if you don't believe this.) You need to
stick in an adverb (maybe "gracefully concise") as standalone
"concise" is owned by APL.

Basilisk96 wrote:
> Did programmers stop writing programs on punch cards because they ran
> out of punch paper?

If you drive on the NYS Thruway, you still get a punch card when you
enter. You turn it in when you pay your toll.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: PIL question

2008-01-09 Thread Fredrik Lundh
Alex K wrote:

> Would anyone know how to generate thumbnails with rounded corners
> using PIL? I'm also considering imagemagick if PIL turns out not to be
> appropriate for the task.

create a mask image with round corners (either with your favourite image 
editor or using ImageDraw/aggdraw or some such).

in your program, load the mask image, and cut out the four corners using 
"crop".

then, for each image, create a thumbnail as usual, and use the corner 
masks on the corners of the thumbnail.

- if you want transparent corners, create an "L" image with the same 
size as the thumbnail, use "paste" to add the corner masks in that 
image, and then use "putalpha" to attach the alpha layer it to the 
thumbnail.

- if you want solid corners, use "paste" on the thumbnail instead, using 
a solid color as the source.



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


Re: alternating string replace

2008-01-09 Thread Neil Cerutti
On Jan 9, 2008 5:34 AM, cesco <[EMAIL PROTECTED]> wrote:
> Hi,
>
> say I have a string like the following:
> s1 = 'hi_cat_bye_dog'
> and I want to replace the even '_' with ':' and the odd '_' with ','
> so that I get a new string like the following:
> s2 = 'hi:cat,bye:dog'
> Is there a common recipe to accomplish that? I can't come up with any
> solution...
>
> Thanks in advance

Hum, hum... If I had a hammer...

from pyparsing import *

word = Word(alphas)
sep = Literal('_').suppress()
pair = Group(word + sep + word)
pairs = delimitedList(pair, '_')

print ','.join(':'.join(t) for t in
   pairs.parseString('hi_cat_bye_dog').asList())

-- 
Neil Cerutti <[EMAIL PROTECTED]>
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: alternating string replace

2008-01-09 Thread Neil Cerutti
On Jan 9, 2008 5:34 AM, cesco <[EMAIL PROTECTED]> wrote:
> Hi,
>
> say I have a string like the following:
> s1 = 'hi_cat_bye_dog'
> and I want to replace the even '_' with ':' and the odd '_' with ','
> so that I get a new string like the following:
> s2 = 'hi:cat,bye:dog'
> Is there a common recipe to accomplish that? I can't come up with any
> solution...
>
> Thanks in advance

Hum, hum... If I had a hammer...
from pyparsing import *

word = Word(alphas)
sep = Literal('_').suppress()
pair = Group(word + sep + word)
pairs = delimitedList(pair, '_')

print ','.join(':'.join(t) for t in
   pairs.parseString('hi_cat_bye_dog').asList())

-- 
Neil Cerutti <[EMAIL PROTECTED]>
-- 
http://mail.python.org/mailman/listinfo/python-list


executing newgrp from python in current shell possible?

2008-01-09 Thread Svenn Are Bjerkem
Hi,
as a user on a linux system I am member of the groups "users" and
"design" with users as my default group. To controll the accessibility
of some parts of the file system, creation of files and directories in
those parts must be done with group "design". This is currently done
manually with "newgrp design" on the command line before doing
anything else. I have been looking for a way to execute this command
as a part of a script, but it seems that the changes are only valid in
the context of the script and when the script exits, the current shell
still have the original "users" group setting. It looks like the
command spawns a new command line in the context of the current xterm
as I get back to my old command line when exiting (instead of the
xterm dissapearing)

A possible alternative could be to have the python script launch a new
shell, but I still have the problem to set the group id for that new
shell (lack of python knowledge). I am happy for any advice. Maybe it
is simply not possible to do this kind of operation from a script in
python on linux.

--
kind regards,
Svenn
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Converting a bidimensional list in a bidimensional array

2008-01-09 Thread Scott David Daniels
Santiago Romero wrote:
>  I'm trying to change my current working source code so that it works
> with an array instead of using a list, but I'm not managing to do it.
> ...
> 
>  This is how I create the tilemap (and the clipboard, a copy of my
> tilemap):
> 
> def __init__( self, bw, bh, tiles ):
>   self.width, self.height = bw, bh
>   self.tilemap = []
>   self.clipboard = []
>   (...)
>   for i in range(bh):
>  self.tilemap.append([0] * bw)
>  self.clipboard.append([0] * bw)

   def __init__( self, bw, bh, tiles ):
 self.width, self.height = bw, bh
 self.tilemap = array.array('b', [0]) * bw * bh
 self.clipboard = array.array('b', self.tilemap)

Gives a pure linearization (you do the math for lines).

   def __init__( self, bw, bh, tiles ):
 self.width, self.height = bw, bh
 self.tilemap = [array.array('b', [0]) * bw for row in range(bh)]
 self.clipboard = [array.array('b', [0]) * bw for row in range(bh)]

Gives a list of arrays.  I punted on the type arg here; you should make
a definite decision based on your data.

--Scott David Daniels
[EMAIL PROTECTED]
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: PIL question

2008-01-09 Thread Fredrik Lundh
Fredrik Lundh wrote:

> create a mask image with round corners (either with your favourite image 
> editor or using ImageDraw/aggdraw or some such).

and for people stumbling upon via a search engine some time in the 
future, Stani just posted a complete example over at the image-sig 
mailing list.



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


Re: Open a List of Files

2008-01-09 Thread Terry Jones
> "Fredrik" == Fredrik Lundh <[EMAIL PROTECTED]> writes:

Fredrik> Seriously, for a limited number of files, the dictionary approach
Fredrik> is mostly pointless; you end up replacing

Fredrik> foo = open("foo")
Fredrik> foo.write(...)

Fredrik> with

Fredrik> somedict["foo"] = open("foo")
Fredrik> somedict["foo"].write(...)

Yes, in some cases. But where you want to do multiple things you can always
pull the file descriptor of of the dict into a local var.

>> - It has less risk of error (much less repetition).

Fredrik> No, it hasn't.  There's more to type when using the files, and you
Fredrik> have *two* things you can misspell; that is, you're replacing a
Fredrik> NameError with either a NameError or a Key Error.

Well I meant less error risk in the context of opening the files. And I'm
happy to get a NameError or KeyError if I make the mistake you describe.
But bad code like this:

messages = open(os.path.join(host_path,'messages.txt'), 'wb')
deliveries = open(os.path.join(host_path,'deliveries.txt'), 'wb')
actions = open(os.path.join(host_path,'deliveries.txt'), 'wb')

doesn't give an error at all, and with all that identical and
semi-identical code it's much less obvious where the error is.

Cut & paste errors like this are pretty common, and they can be quite hard
to find (when they don't result in exceptions), in my experience.

>> - It allows your code to later take a string file tag and
>> write to that file by looking up its file descriptor in the dict.

Fredrik> Instead of allowing your code to take a file object and write to that 
Fredrik> file by writing to that file object?

No, see below:

>> - You can close all open files with a trivial loop.

Fredrik> Ok, this is actually an advantage.  Not that you need to do that very 
Fredrik> often, since Python does it for you.

Yes.  That's partly why I said it would make him a better programmer in
general, not just in Python.

Fredrik> And if you find yourself needing to do this a lot, you can of
Fredrik> course stuff all the output files in a list but *still* use the
Fredrik> variables to refer to the file when writing to them.

Yes, as above.

Fredrik> There is one case where a dictionary of files makes perfect sense, of 
Fredrik> course, and that's when you can associate the file with some *other* 
Fredrik> value that you're *already* using. (Say, a user name or a machine name 
Fredrik> or a severity level or something like that.)

Yes. That's what I meant by my original - badly worded - remark (see above)
that you could take a "string file tag" and use it to look up its file
descriptor.

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


Re: Open a List of Files

2008-01-09 Thread Terry Jones
> "BJ" == BJ Swope <[EMAIL PROTECTED]> writes:

I (at least) think the code looks much nicer.

BJ> #Referring to files to write in various places...
BJ> open_files['deliveries'].write(flat_line)
BJ> open_files['deliveries'].write('\n')

If you were doing a lot with the deliveries file at some point, you could
put the file descriptor into a local variable

  deliveries = open_files['deliveries']
  deliveries.write(flat_line)
  deliveries.write('\n')

BJ> #And finally to close the opened files
BJ> for fn in open_files.keys():
BJ> open_files[fn].close()

You don't need "for fn in open_files.keys():", you can just use "for fn in
open_files:", but simpler than that is to just use the dictionary values:

for fn in open_files.values():
fn.close()

Regards,
Terry
-- 
http://mail.python.org/mailman/listinfo/python-list


problem building simple package with extensions in Windows, but not OS X

2008-01-09 Thread Brian Blais

Hello,

I am trying to build a package of mine, and for some reason the build  
process with distutils is failing in Windows, but not in OS X (and I  
imagine also in Linux, but I haven't tested it).  I am not sure if  
this is a Pyrex problem, a distutils problem, or me doing something  
stupid problem.  :)


I boiled it down to the simplest package that still fails.  My  
setup.py is:


from distutils.core import setup
from distutils.extension import Extension
from Pyrex.Distutils import build_ext

setup(
  name = 'myproject',
  version='0.0.1',
  description="Here is a description",
  author="Brian Blais",
  ext_modules=[
Extension("myproject/train",["myproject/train.pyx"]),
],

  packages=['myproject'],

  cmdclass = {'build_ext': build_ext}
)



and my project has one directory, myproject, with two files.   
train.pyx is:


def func(blah):

print blah


and an __init__.py, which has the single line:

import train


So, in OS X, I can do

python setup.py build

and the build goes through.  In windows, with the same basic setup  
(version numbers all below), I get:


[Desktop\test]|5> !python setup.py build
running build
running build_py
creating build
creating build\lib.win32-2.5
creating build\lib.win32-2.5\myproject
copying myproject\__init__.py -> build\lib.win32-2.5\myproject
running build_ext
building 'myproject/train' extension
creating build\temp.win32-2.5
creating build\temp.win32-2.5\Release
creating build\temp.win32-2.5\Release\myproject
c:\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -Ic:\python25\include  
-Ic:\pytho
n25\PC -c myproject/train.c -o build\temp.win32-2.5\Release\myproject 
\train.o

writing build\temp.win32-2.5\Release\myproject\train.def
c:\mingw\bin\gcc.exe -mno-cygwin -shared -s build\temp.win32-2.5 
\Release\myproje
ct\train.o build\temp.win32-2.5\Release\myproject\train.def -Lc: 
\python25\libs -
Lc:\python25\PCBuild -lpython25 -lmsvcr71 -o build\lib.win32-2.5 
\myproject/train

.pyd
Cannot export initmyproject/train: symbol not defined
collect2: ld returned 1 exit status
error: command 'gcc' failed with exit status 1



On both the Mac and the PC I have:

Python 2.5.1
Pyrex version 0.9.5.1a
distutils 2.5.1



am I doing something wrong?


thanks,

Brian Blais



--
Brian Blais
[EMAIL PROTECTED]
http://web.bryant.edu/~bblais



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

How to get memory size/usage of python object

2008-01-09 Thread Santiago Romero

 Is there a way to check the REAL size in memory of a python object?

 Something like

> print sizeof(mylist)

 or

> print sizeof(myclass_object)

 or something like that ...

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


packaging questions

2008-01-09 Thread Brian Blais

Hello,

I am trying to package a number of python files, and I plan to use  
Mercurial to do the version control.  In more established projects  
that I see, I notice that there are a number of files, like  
Changelog, MANIFEST, INSTALL, etc... that would seem to be generated  
automatically.  Also, within the python code, and the setup.py, there  
are properties like __version__ which one would like to have  
generated automatically as well, so that you aren't hand-editing a  
number of files.


Is there a standard way of doing this?


thanks,

Brian Blais

--
Brian Blais
[EMAIL PROTECTED]
http://web.bryant.edu/~bblais



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

Re: Open a List of Files

2008-01-09 Thread Tim Chase
> You don't need "for fn in open_files.keys():", you can just use "for fn in
> open_files:", but simpler than that is to just use the dictionary values:
> 
> for fn in open_files.values():
> fn.close()

This can also work for standard variable names:

   for f in (messages, deliveries, actions, parts,
   recipients, viruses, esp_scores):
 f.close()

-tkc


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


Re: Problem in the program flow...please help?

2008-01-09 Thread Jerry Hill
On Jan 9, 2008 7:44 AM, jatin patni <[EMAIL PROTECTED]> wrote:
> I have a button(GUI) which when clicked, calls a function connect( ) which
> takes around 5-20 seconds to complete(As I mentioned Earlier)
> The problem is, during this time the other part of the code is rendered
> useless, I cannot access other parts of the code, for example a cancel( )
> function to be called when cancel button is pressed, cannot be pressed until
> the previous function is completed and moreover the GUI hangs(stops
> responding).

See http://wiki.wxpython.org/LongRunningTasks for a discussion of some
of the ways you can deal with this.

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


Re: "Canonical" way of deleting elements from lists

2008-01-09 Thread Nick Craig-Wood
Fredrik Lundh <[EMAIL PROTECTED]> wrote:
>  Nick Craig-Wood wrote:
> 
> > Using keywords[:] stops the creation of another temporary list.
> 
>  in CPython, "list[:] = iter" actually creates a temporary list object on 
>  the inside, in case "iter" isn't already a list or a tuple.
> 
>  (see the implementation of PySequence_Fast() for details).

Ah, OK, thanks for the correction!

-- 
Nick Craig-Wood <[EMAIL PROTECTED]> -- http://www.craig-wood.com/nick
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How does unicode() work?

2008-01-09 Thread Fredrik Lundh
Carsten Haese wrote:

> If that really is the line that barfs, wouldn't it make more sense to
> repr() the unicode object in the second position?
> 
> import sys
> for k in sys.stdin:
>  print '%s -> %s' % (k, repr(k.decode('iso-8859-1')))
> 
> Also, I'm not sure if the OP has told us the truth about his code and/or
> his error message. The implicit str() call done by formatting a unicode
> object with %s would raise a UnicodeEncodeError, not the
> UnicodeDecodeError that the OP is reporting. So either I need more
> coffee or there is something else going on here that hasn't come to
> light yet.

When mixing Unicode with byte strings, Python attempts to decode the 
byte string, not encode the Unicode string.

In this case, Python first inserts the non-ASCII byte string in "%s -> 
%s" and gets a byte string.  It then attempts to insert the non-ASCII 
Unicode string, and realizes that it has to convert the (partially 
built) target string to Unicode for that to work.  Which results in a 
*UnicodeDecodeError*.

 >>> "%s -> %s" % ("åäö", "åäö")
'\x86\x84\x94 -> \x86\x84\x94'

 >>> "%s -> %s" % (u"åäö", u"åäö")
u'\xe5\xe4\xf6 -> \xe5\xe4\xf6'

 >>> "%s -> %s" % ("åäö", u"åäö")
Traceback (most recent call last):
   File "", line 1, in 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x86 ...

(the actual implementation differs a bit from the description above, but 
the behaviour is identical).



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


Re: Converting a bidimensional list in a bidimensional array

2008-01-09 Thread Santiago Romero
> >  This is how I create the tilemap (and the clipboard, a copy of my
> > tilemap):
>
> > def __init__( self, bw, bh, tiles ):
> >   self.tilemap = []
> >   (...)
> >   for i in range(bh):
> >  self.tilemap.append([0] * bw)

>def __init__( self, bw, bh, tiles ):
>  self.width, self.height = bw, bh
>  self.tilemap = array.array('b', [0]) * bw * bh
>
> Gives a pure linearization (you do the math for lines).

 Do you mean : tilemap[(width*y)+x] ?

>def __init__( self, bw, bh, tiles ):
>  self.width, self.height = bw, bh
>  self.tilemap = [array.array('b', [0]) * bw for row in range(bh)]
>
> Gives a list of arrays.  I punted on the type arg here; you should make
> a definite decision based on your data.

 What do you think about:

- Memory Performance: Of course, my maps will take ( 16 bytes / 2-4
bytes ) = 8 or 4 times less memory (32 / 64 bit processores) ...
right?

- Speed Performance: Do you think that changing from list to Array()
would improve speed? I'm going to do lots of tilemap[y][x] checks (I
mean, player jumping around the screen, checking if it's falling over
a non-zero tile, and so).

 And thanks a lot for your answer :-)
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How to get memory size/usage of python object

2008-01-09 Thread Fredrik Lundh
Santiago Romero wrote:

>  Is there a way to check the REAL size in memory of a python object?

in standard Python, without reading the interpreter source code 
carefully, no.

to get an approximate value, create a thousand (or a million) objects 
and check how much the interpreter grows when you do that.



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


Re: alternating string replace

2008-01-09 Thread Pablo Ziliani
cesco wrote:
> Hi,
>
> say I have a string like the following:
> s1 = 'hi_cat_bye_dog'
> and I want to replace the even '_' with ':' and the odd '_' with ','
> so that I get a new string like the following:
> s2 = 'hi:cat,bye:dog'
> Is there a common recipe to accomplish that? I can't come up with any
> solution...

What about:

>>> import re
>>> s1 = 'hi_cat_bye_dog'
>>> print re.sub(r'([^_]+)_([^_]+)_?', r'\1:\2;', s1)
hi:cat;bye:dog;

it still works for a longer string:
>>> s1 = 'hi_cat_bye_dog_' + s1
>>> s1
'hi_cat_bye_dog_hi_cat_bye_dog'
>>> print re.sub(r'([^_]+)_([^_]+)_?', r'\1:\2;', s1)
hi:cat;bye:dog;hi:cat;bye:dog;


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


RE: 'Borg' and multiple threads.

2008-01-09 Thread Reedick, Andrew


> -Original Message-
> From: [EMAIL PROTECTED] [mailto:python-
> [EMAIL PROTECTED] On Behalf Of Tobiah
> Sent: Monday, January 07, 2008 5:24 PM
> To: [email protected]
> Subject: 'Borg' and multiple threads.
> 
> I have a class that I call Borg that starts like this:
> 
> class Borg(dict):
> 
> static_state = {}
> def __init__(self):
> self.__dict__ = self.static_state
> 
> 
> 
> My question is why this seems to work.  I had the idea that
> there was a class object that is created when the file containing
> the definition is read, which actually contains the static
> information that is later accessed by instances.  Isn't this
> done when the cherrypy app first loads, rather than each time
> a browser hits the app?  Otherwise, where is the individual data
> stored for each of two simultaneous hits of the web page?
> 


I had a similar question except mine was from a bug.  (Thinking in c++
lead me to inadvertently create static class vars.)  

You can "print self" and use the id() function to get the memory
addresses of the variables and see what's going on.  In the code below,
mem4 is equivalent to your static_state.

count = 1

class Foo:

mem4 = {}
mem5 = {}

def __init__(self):
self.mem = {}

global count
count += 1
self.mem2 = count

self.mem3 = "%x" % (id(self))

self.mem5 = {}

print 'init count =', count


def me(self):
print "object:  ", self
print "\tid(self.mem)  %x" % (id(self.mem)), " self.mem
=", self.mem
print "\tid(self.mem2) %x" % (id(self.mem2)), "
self.mem2 =", self.mem2
print "\tid(self.mem3) %x" % (id(self.mem3)), "
self.mem3 =", self.mem3
print "\tid(self.mem4) %x" % (id(self.mem4)), "
self.mem4 =", self.mem4
print "\tid(self.mem5) %x" % (id(self.mem5)), "
self.mem5 =", self.mem5
global count
count += 1
print '\tcount =', count
self.mem4[count] = count
print "\tid(self.mem4) %x" % (id(self.mem4)), "
self.mem4 =", self.mem4
#self.mem += count
#print "\tid(self.mem)  %x" % (id(self.mem)), " self.mem
=", self.mem
print


a = Foo()
b = Foo()
c = Foo()

a.me()
b.me()
c.me()
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How does unicode() work?

2008-01-09 Thread Carsten Haese
On Wed, 2008-01-09 at 13:44 +0100, Fredrik Lundh wrote:
> Robert Latest wrote:
> 
> > Here's a test snippet...
> > 
> > import sys
> > for k in sys.stdin:
> > print '%s -> %s' % (k, k.decode('iso-8859-1'))
> > 
> > ...but it barfs when actually fed with iso8859-1 characters. How is this 
> > done right?
> 
> it's '%s -> %s' % (byte string, unicode string) that barfs.  try doing
> 
> import sys
> for k in sys.stdin:
>  print '%s -> %s' % (repr(k), k.decode('iso-8859-1'))
> 
> instead, to see what's going on.

If that really is the line that barfs, wouldn't it make more sense to
repr() the unicode object in the second position?

import sys
for k in sys.stdin:
 print '%s -> %s' % (k, repr(k.decode('iso-8859-1')))

Also, I'm not sure if the OP has told us the truth about his code and/or
his error message. The implicit str() call done by formatting a unicode
object with %s would raise a UnicodeEncodeError, not the
UnicodeDecodeError that the OP is reporting. So either I need more
coffee or there is something else going on here that hasn't come to
light yet.

-- 
Carsten Haese
http://informixdb.sourceforge.net


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


Re: How does unicode() work?

2008-01-09 Thread Carsten Haese
On Wed, 2008-01-09 at 15:33 +0100, Fredrik Lundh wrote:
> When mixing Unicode with byte strings, Python attempts to decode the 
> byte string, not encode the Unicode string.

Ah, I did not realize that. I never mix Unicode and byte strings in the
first place, and now I know why. Thanks for clearing that up.

-- 
Carsten Haese
http://informixdb.sourceforge.net


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


Re: Natural-language datetime parsing and display (was: user friendly datetime features)

2008-01-09 Thread Paul McGuire
On Jan 8, 7:57 pm, Ben Finney <[EMAIL PROTECTED]>
wrote:
> "Daniel Fetchinson" <[EMAIL PROTECTED]> writes:
> > I'm guessing this feature is needed so often in so many projects that
> > it has been implemented already by several people. Does anyone know of
> > such a stand alone module?
>
> The 'python-dateutil' library allows easy *programmatic* manipulation
> of relative date expressions, but not in natural language.
>

I think the OP was looking for presentation of dates in a friendly
format, not parsing, but it so happens that I started such a parser
with pyparsing about a month ago, and was about 1/2 finished with it
when I saw your post.  I dredged up the code from where it was, and
have a semi-working version now.

NLTK is not needed, as you can constrain and structure the vocabulary
surprisingly well.  Probably trickier is to establish your own
conventions for the meanings of "now", "today", etc.  (For instance, I
interpret "today" as "the current date, at time 00:00:00".) "A day
from now" is "the current time, with tomorrow's date".  "In a day"
could go either way - interpret like "tomorrow" or like "a day from
now."  But once these are settled, a reasonable grammar can be
composed.

My first version is fairly brute force and hackish, but I've gotten
some insights into the date arithmetic, and which words behave much
like operators.  Of course, this is all driven around English and
English idioms - converting to another language would probably be
starting from scratch.

Here are the tests for this first version (these tests all pass):
today
tomorrow
yesterday
in a couple of days
a couple of days from now
a couple of days from today
in a day
3 days ago
3 days from now
a day ago
now
10 minutes ago
10 minutes from now
in 10 minutes
in a minute
in a couple of minutes
20 seconds ago
in 30 seconds
20 seconds before noon
20 seconds before noon tomorrow
noon
midnight
noon tomorrow

You can see the results and the parser code at:
http://pyparsing.wikispaces.com/UnderDevelopment.

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


Re(Thanks...Re: Problem in the program flow...please help?)

2008-01-09 Thread jatin patni
Thanks Jerry..For the link...I am looking into it...

On Jan 9, 2008 2:36 PM, Jerry Hill <[EMAIL PROTECTED]> wrote:

> On Jan 9, 2008 7:44 AM, jatin patni <[EMAIL PROTECTED]> wrote:
> > I have a button(GUI) which when clicked, calls a function connect( )
> which
> > takes around 5-20 seconds to complete(As I mentioned Earlier)
> > The problem is, during this time the other part of the code is rendered
> > useless, I cannot access other parts of the code, for example a cancel(
> )
> > function to be called when cancel button is pressed, cannot be pressed
> until
> > the previous function is completed and moreover the GUI hangs(stops
> > responding).
>
> See http://wiki.wxpython.org/LongRunningTasks for a discussion of some
> of the ways you can deal with this.
>
> --
> Jerry
>
-- 
http://mail.python.org/mailman/listinfo/python-list

subprocess.Popen spawning cmd shells

2008-01-09 Thread Mrown
Hi,
  I'm currently writing a python program that relies on a CLI
program.  What I'm currently doing is using subprocess.Popen on Python
2.5.1.  Here's the line that I'm currently running:

child = subprocess.Popen(["c:\app.exe", node, "-w",
str(tmpTime * 1000), '-n', str(1), '-l'], stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)

The problem is that although the above works, a CMD shell is spawned
and becomes visible for each time I run the above.  I thought that by
redircting stdin, stdout and stderr, no CMD shell should pop-up.  Is
something wrong in the way I'm using subprocess?  Thanks for your help.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: stupid/style/list question

2008-01-09 Thread Duncan Booth
[EMAIL PROTECTED] wrote:

> Duncan Booth:
>> I tried to measure this with timeit, and it looks like the 'del' is
>> actually quite a bit faster (which I find suprising).
> 
> Yes, it was usually faster in my benchmarks too. Something similar is
> true for dicts too. I think such timings are influenced a lot by the
> garbage collector.
> 
That may come into it, but I made the obvious change I mentioned (to avoid 
dereferncing a pointer every time through the loop) and got about an 8% 
speed-up on my test. I don't think that explains all of the speed 
difference though, so the garbage collector may come into it too: I'll see 
if I can do some more experimentation before submitting a patch.

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


Re: Python's great, in a word

2008-01-09 Thread Paddy
On Jan 9, 1:02 pm, [EMAIL PROTECTED] wrote:
> Thanks to all for many helpful suggestions.
>
> Python, by the way, is verbose when compared to APL. 
> (Seehttp://catpad.net/michael/apl/if you don't believe this.) You need to
> stick in an adverb (maybe "gracefully concise") as standalone
> "concise" is owned by APL.
>
> Basilisk96 wrote:
> > Did programmers stop writing programs on punch cards because they ran
> > out of punch paper?
>
> If you drive on the NYS Thruway, you still get a punch card when you
> enter. You turn it in when you pay your toll.

I didn't reread my blog post! I meant Python is *succinct* with
definition:
  http://www.askoxford.com/concise_oed/succinct?view=uk

"Briefly and clearly expressed".

(I should engage brain before typing).

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


Re: Collecting Rich Data Structures for students

2008-01-09 Thread Paddy
On Jan 9, 6:52 am, Paddy <[EMAIL PROTECTED]> wrote:
> On Jan 9, 2:19 am, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]>
> wrote:
>
>
>
> > Greetings Pythoneers --
>
> > Some of us over on edu-sig, one of the community actives,
> > have been brainstorming around this Rich Data Structures
> > idea, by which we mean Python data structures already
> > populated with non-trivial data about various topics such
> > as:  periodic table (proton, neutron counts); Monty Python
> > skit titles; some set of cities (lat, long coordinates); types
> > of sushi.
>
> > Obviously some of these require levels of nesting, say
> > lists within dictionaries, more depth of required.
>
> > Our motivation in collecting these repositories is to give
> > students of Python more immediate access to meaningful
> > data, not just meaningful programs.  Sometimes all it takes
> > to win converts, to computers in general, is to demonstrate
> > their capacity to handle gobs of data adroitly.  Too often,
> > a textbook will only provide trivial examples, which in the
> > print medium is all that makes sense.
>
> > Some have offered XML repositories, which I can well
> > understand, but in this case we're looking specifically for
> > legal Python modules (py files), although they don't have
> > to be Latin-1 (e.g. the sushi types file might not have a
> > lot of romanji).
>
> > If you have any examples you'd like to email me about,
> > [EMAIL PROTECTED] is a good address.
>
> > Here's my little contribution to the 
> > mix:http://www.4dsolutions.net/ocn/python/gis.py
>
> > Kirby Urner
> > 4D Solutions
> > Silicon Forest
> > Oregon
>
> I would think there was more data out there formatted as Lisp S-
> expressions than Python data-structures.
> Wouldn't it be better to concentrate on 'wrapping' XML and CSV data-
> sources?
>
> - Paddy.

The more I think on it the more I am against this- data should be
stored in programming language agnostic forms but which are easily
made available to a large range of programming languages.
If the format is easily parsed by AWK then it is usually easy to parse
in a range of programming languages.

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


Re: sqlite fetchall breacking because decoding.

2008-01-09 Thread Fredrik Lundh
tyoc wrote:

> The database is not corrupt, I mean Im sure if I do a C program for
> read and print the row, it will get it and just printit and not fail
> like this

well, the database *is* corrupt, since sqlite3 (both the engine and the 
Python binding) expects you to use a supported encoding for the data 
stored in the database:

 http://www.sqlite.org/datatype3.html
 http://docs.python.org/lib/node346.html

the fact that you're able to use an API that doesn't care about 
encodings at all to violate the database requirements doesn't 
necessarily mean that an API that does the right thing is broken...

if you're not able to fix your database, you have to plug in a custom
text_factory handler.  this should work:

 conn = sqlite3.Connect(...)
 conn.text_factory = str

also see:

 http://docs.python.org/lib/sqlite3-Connection-Objects.html



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


Re: subprocess.Popen spawning cmd shells

2008-01-09 Thread Mrown
On Jan 9, 5:17 pm, Mrown <[EMAIL PROTECTED]> wrote:
> Hi,
>   I'm currently writing a python program that relies on a CLI
> program.  What I'm currently doing is using subprocess.Popen on Python
> 2.5.1.  Here's the line that I'm currently running:
>
>             child = subprocess.Popen(["c:\app.exe", node, "-w",
> str(tmpTime * 1000), '-n', str(1), '-l'], stdin=subprocess.PIPE,
> stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>
> The problem is that although the above works, a CMD shell is spawned
> and becomes visible for each time I run the above.  I thought that by
> redircting stdin, stdout and stderr, no CMD shell should pop-up.  Is
> something wrong in the way I'm using subprocess?  Thanks for your help.

To anyone interested, I found the solution by using the
CREATE_NO_WINDOW creation flag.  So this is what the code now looks
like (and it doesn't spawn any shells):

CREATE_NO_WINDOW = 0x800
child = subprocess.Popen(["c:\app.exe", node, "-w",
str(tmpTime * 1000), '-n', str(1), '-l'], stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags =
CREATE_NO_WINDOW)
-- 
http://mail.python.org/mailman/listinfo/python-list


sqlite fetchall breacking because decoding.

2008-01-09 Thread tyoc
here is the snips that can reproduce my problem in the system Im
working http://tyoc.nonlogic.org/darcsrepos/snip1.zip it is 2 files a
sample db with 1 row and a py with 1 function for read that row

The output I get is the following:

--

Traceback (most recent call last):
  File "C:\Documents and Settings\dortiz\Escritorio\x\snip1.py", line
14, in 
l = CargaRegs(basededatos, "identificadores")
  File "C:\Documents and Settings\dortiz\Escritorio\x\snip1.py", line
6, in CargaRegs
db_curs.execute("SELECT * FROM " + tabla)
OperationalError: Could not decode to UTF-8 column 't' with text 'some
texto--- años'


I dont understand exactly (thought I know is a decode error) but I
have created the dabatabse with python reading a CSV file that
apparently have encoding ANSI or CP1252 because the "ñ" is stored as
0xF1.


The problem like I understand is that python try to decode it like if
it where UTF8 (if the database contain ASCII chars only, this work
just great, but with other chars like "ñ" this doesnt work).

Like you see the problem come when I do db_curs.fetchall() thus I dont
know how to fetchall without this problem.

The database is not corrupt, I mean Im sure if I do a C program for
read and print the row, it will get it and just printit and not fail
like this, also you can open the DB directly with sqlite3 and
just .dump and it work at less it can fetch the row without fail (even
that in the depending on the console ir will or not print the correct
character).

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


Problem in importing modules using py2exe

2008-01-09 Thread jatin patni
I am trying to generate binaries on Windows platform using py2exe, but it is
unable to import this module named "Mechanize". The error says " it could
not find this module"...while the module is present along with all the other
modules "Python/Lib/site-packages/"...

Any help would be appreciated...Thanks!
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: sqlite fetchall breacking because decoding.

2008-01-09 Thread tyoc
> well, the database *is* corrupt, since sqlite3 (both the engine and the
> Python binding) expects you to use a supported encoding for the data
> stored in the database:
>
>  http://www.sqlite.org/datatype3.html
>  http://docs.python.org/lib/node346.html

Still like I said before, I have imported that data from python source
was a CVS with that encoding, I readed the lines with module CSV, then
used insert to the database like:


-
stmt = "INSERT INTO %s (CID, t) VALUES (?,?)"%(tabla)
for l in ls:
db_curs.execute(stmt, (l[0], l[2]))
db_connection.commit()
-
Where l[0] and l[2] where the ones read from the CSV each row was
append to ls,  l[1] was the key thus I dont need it here.



Thus this "corruption" can only come from those statements (the ones
adding data), thus is doable that you corrupt your database within
python without see it until you try to read them (because even that
the ASCII codec can't decode 0xF1 an ASCII string 'container' can
contain it...).


Anyway, I think the data is stored as cp1252 this show it:
>>>u"ñaña".encode("cp1252")
'\xf1a\xf1a'
that is the 0xF1 that I can see, but it need "encoded" like "\xf1" not
like the byte 0xF1.

I read the original CSV file with normal open... thus I gess I need
some like

f = codecs.open("csv.txt", encoding="cp1252")
ls = f.readlines()

And then store the lines and see if sqlite can handle those lines?, I
will try that.
-- 
http://mail.python.org/mailman/listinfo/python-list


printing dots in simple program while waiting

2008-01-09 Thread John
Ok, so this should be a really simple thing to do, but I haven't been
able to get it on the first few tries and couldn't find anything after
searching a bit.

what i want to do is print a 'waiting' statement while a script is
working-- the multithreading aspect isn't an issue, the printing on
the same line is.  i want to print something like:

(1sec) working...
(2sec) working
(3sec) working.


where the 'working' line isn't being printed each second, but the dots
are being added with time.

something like:

import time
s = '.'
print 'working'
while True:
print s
time.sleep(1)


however, this doesn't work since it prints:

working
.
.
.

any suggestions?
-- 
http://mail.python.org/mailman/listinfo/python-list


asynchronous timer events - how to?

2008-01-09 Thread Helmut Jarausch
Hi,

I'm using a web server (Karrigell) which is based on the asyncore module.
I'd like to be able to checkpoint some data (e.g. pickled dictionaries) to disk
from time to time.
For that I would need to setup a timer which calls a Python object/function 
when 
its time interval has expired. While this function is running I need access to 
the variables of the server.

Can this be done in a simple way?

Many thanks for a hint,

Helmut Jarausch

Lehrstuhl fuer Numerische Mathematik
RWTH - Aachen University
D 52056 Aachen, Germany
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: printing dots in simple program while waiting

2008-01-09 Thread Tim Chase
Martin Marcher wrote:
> John wrote:
> 
>> import time
>> s = '.'
>> print 'working', # Note the "," at the end of the line
>> while True:
>> print s, #Note the "," at the end of this line too...
>> time.sleep(1)
> 
> see my comment in the code above...

see my added comment in the code above...

Though this will produce spaces between the dots:

   waiting . . . . . .

To eliminate the spaces, you need to write to a file-stream such 
as sys.stdout:

   from sys import stdout
   stdout.write('working')
   while True:
 stdout.write('.')
 # might need something like stdout.flush() here
 time.sleep(1)
   stdout.write('\n')

-tkc



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


Re: sqlite fetchall breacking because decoding.

2008-01-09 Thread Fredrik Lundh
tyoc wrote:

>> well, the database *is* corrupt, since sqlite3 (both the engine and the
>> Python binding) expects you to use a supported encoding for the data
>> stored in the database:
>>
>>  http://www.sqlite.org/datatype3.html
>>  http://docs.python.org/lib/node346.html
> 
> Still like I said before, I have imported that data from python source
> was a CVS with that encoding, I readed the lines with module CSV, then
> used insert to the database like:

the CSV module doesn't decode stuff for you; that's up to your code.  see

 http://docs.python.org/lib/csv-examples.html#csv-examples

for sample code (scroll down to the paragraph that starts with "The csv 
module doesn't directly support reading and writing Unicode").



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


Re: printing dots in simple program while waiting

2008-01-09 Thread John
On Jan 9, 11:56 am, Martin Marcher <[EMAIL PROTECTED]> wrote:
> John wrote:
> > import time
> > s = '.'
> > print 'working', # Note the "," at the end of the line
> > while True:
> > print s
> > time.sleep(1)
>
> see my comment in the code above...
>
> if that's what you mean
>
> /martin
>
> --http://noneisyours.marcher.namehttp://feeds.feedburner.com/NoneIsYours
>
> You are not free to read this message,
> by doing so, you have violated my licence
> and are required to urinate publicly. Thank you.

Thanks for the input Martin, but I already tried that.  If you put a
comma on that line it successfully prints the first '.' on the same
line, but the rest below.  Like:

working .
.
.
.



I want:

working..


I have tried the comma thing on the "print s" line ("print s,"), but
then it doesn't print anything at all...
-- 
http://mail.python.org/mailman/listinfo/python-list


centre of mass of protein

2008-01-09 Thread smriti Sebastian
hi all,
Is there any script or module in python where we can find the centre of mass
of protein?
-- 
http://mail.python.org/mailman/listinfo/python-list

RE: printing dots in simple program while waiting

2008-01-09 Thread Reedick, Andrew


> -Original Message-
> From: [EMAIL PROTECTED] [mailto:python-
> [EMAIL PROTECTED] On Behalf Of Martin Marcher
> Sent: Wednesday, January 09, 2008 11:57 AM
> To: [email protected]
> Subject: Re: printing dots in simple program while waiting
> 
> John wrote:
> 
> > import time
> > s = '.'
> > print 'working', # Note the "," at the end of the line
> > while True:
> > print s
> > time.sleep(1)
> 
> see my comment in the code above...
> 
> if that's what you mean
> 


Bah.  The trailing command may prevent the newline, but it appends a
space whether you want it or not.[1]  Use sys.stdout.write('.') instead.

import sys

print "wussy nanny state, tax 'n spend my spaces, liberal comma:"
for i in range(1, 10):
print '.',
print
print "manly neo-con I know what's Right so keep your government out of
my strings! print:"
for i in range(1, 10):
sys.stdout.write('.')

[1] Which has to be _the_ most annoying feature of Python.  *grrr*

*

The information transmitted is intended only for the person or entity to which 
it is addressed and may contain confidential, proprietary, and/or privileged 
material. Any review, retransmission, dissemination or other use of, or taking 
of any action in reliance upon this information by persons or entities other 
than the intended recipient is prohibited. If you received this in error, 
please contact the sender and delete the material from all computers. GA625


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


Re: asynchronous timer events - how to?

2008-01-09 Thread Fredrik Lundh
Helmut Jarausch wrote:

> I'm using a web server (Karrigell) which is based on the asyncore module.
> I'd like to be able to checkpoint some data (e.g. pickled dictionaries) to 
> disk
> from time to time.
> For that I would need to setup a timer which calls a Python object/function 
> when 
> its time interval has expired. While this function is running I need access 
> to 
> the variables of the server.

the usual way to do that with asyncore is to add an outer control loop 
that calls asyncore.loop with a count argument (or poll directly), and 
checks a "task queue" at regular intervals.

but in your case, it's probably easier to set up a cron job that does
a "wget" against your server with a "secret" URL, and have the server do 
the checkpointing whenever that URL is fetched.



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


Re: printing dots in simple program while waiting

2008-01-09 Thread Martin Marcher
John wrote:

> import time
> s = '.'
> print 'working', # Note the "," at the end of the line
> while True:
> print s
> time.sleep(1)

see my comment in the code above...

if that's what you mean

/martin

-- 
http://noneisyours.marcher.name
http://feeds.feedburner.com/NoneIsYours

You are not free to read this message,
by doing so, you have violated my licence
and are required to urinate publicly. Thank you.

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


  1   2   3   >