freeze in python3
NOTE: This is related but is not a duplicate of my post from yesterday. Has anyone used Tools/freeze/freeze.py in python3? I tried it with a clean source distribution and for some reason freeze.py is generating code that uses the old naming convention for module init functions. I get the following unresolved symbols for the default hello.py: Undefined symbols for architecture i386: "_init_codecs", referenced from: __PyImport_Inittab in config.o "_init_functools", referenced from: __PyImport_Inittab in config.o "_init_thread", referenced from: __PyImport_Inittab in config.o "_initerrno", referenced from: __PyImport_Inittab in config.o "_initposix", referenced from: __PyImport_Inittab in config.o "_initgc", referenced from: __PyImport_Inittab in config.o "_init_locale", referenced from: __PyImport_Inittab in config.o "_init_io", referenced from: __PyImport_Inittab in config.o "_init_sre", referenced from: __PyImport_Inittab in config.o "_initimp", referenced from: __PyImport_Inittab in config.o "_initpwd", referenced from: __PyImport_Inittab in config.o "_init_weakref", referenced from: __PyImport_Inittab in config.o "_initsignal", referenced from: __PyImport_Inittab in config.o "_initzipimport", referenced from: __PyImport_Inittab in config.o For example, initerrno should now be PyInit_errno. Am I missing something? -- http://mail.python.org/mailman/listinfo/python-list
Re: Creating a local variable scope.
On Nov 30, 1:26 am, markolopa wrote: > I would be much happier with the smaller namespace. To fix the code > that you show I would impose > > s = None > while True: > s = raw_input("enter something: ") > if s not in ('q', 'quit', 'exit'): break > print s So you propose: if the variable exists in a wider scope, you ideal python would not create it in an inner scope. How is this helping your original case? I remind you: class ValueColumn(AbstractColumn): def __init__(self, name, header, domain_names): if type(domain_names) != tuple: raise ValueError('blub') for name in domain_names: if type(name) != str: raise ValueError('blub') self.domain_names = domain_names super(ValueColumn, self).__init__(name, header) When "for name" is reached, "name" already exists and no local variable would be created. How does this help you? -- http://mail.python.org/mailman/listinfo/python-list
Re: How do I Block Events in wxPython
Wanderer wrote: >I have a wxPython program which does some calculations and displays > the results. During these calculations if I click the mouse inside the > dialog the program locks up. If I leave the dialog alone the process > completes fine. I have tried running the function from a separate > dialog with Show Modal and I have tried using SetEvtHandlerEnabled all > to no avail. The program is long and occupies several files so I won't > show the whole thing but here is the calculation part. How do I block > events? > I also need to block events in my wxPython app, though the time duration is very short. I have a separate thread that sends notification of gui events to a server, and waits for a response. I do not want the user to do anything until the response is received. I use threading.Event() for this - import threading event_waiting = threading.Event() event_waiting.set() # set event to True In the gui thread, when I want to block, I have this - event_waiting.clear() # set event to False event_waiting.wait() # block until event becomes True In the worker thread, when the response has been received and acted upon, I have - event_waiting.set() # set event to True, which unblocks the gui thread HTH Frank Millman -- http://mail.python.org/mailman/listinfo/python-list
Re: switch
On Wed, 09 Dec 2009 18:50:29 +, Nobody wrote: > On Tue, 08 Dec 2009 21:02:44 -0800, Kee Nethery wrote: > >> I string together a bunch of elif statements to simulate a switch >> >> if foo == True: >> blah >> elif bar == True: >> blah blah >> elif bar == False: >> blarg >> elif > > This isn't what would normally be considered a switch (i.e. what C > considers a switch). Anyone would think that C was the only programming language in existence... > A switch tests the value of an expression against a > set of constants. In C. Things may be different in other languages. For example, I recall the so-called "4GL" (remember when that was the marketing term of choice for interpreted programming languages?) Hyperscript from Informix. I can't check the exact syntax right now, but it had a switch statement which allowed you to do either C-like tests against a single expression, or if-like multiple independent tests. Moving away from obsolete languages, we have Ruby which does much the same thing: if you provide a test value, the case expression does a C- like test against that expression, and if you don't, it does if-like multiple tests. http://www.skorks.com/2009/08/how-a-ruby-case-statement-works-and-what- you-can-do-with-it/ > If you were writing the above in C, you would need to > use a chain of if/else statements; you couldn't use a switch. > > Compiled languages' switch statements typically require constant labels > as this enables various optimisations. Pascal, for example, can test against either single values, enumerated values, or a range of values: case n of 0: writeln('zero'); 1, 2: writeln('one or two'); 3...10: writeln('something between three and ten'); else writeln('something different'); end; -- Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Graph library for Python
On Wed, Dec 9, 2009 at 11:09 PM, geremy condra wrote: > On Wed, Dec 9, 2009 at 8:59 PM, Bearophile wrote: >> Robin Becker: >> >>> There are already very many implementations eg >>> >>> http://code.google.com/p/igraphhttp://www.boost.org/doc/libs/release/libs/graphhttp://ernst-schroeder.uni.lu/Digraph/doc/http://code.google.com/p/python-graphhttp://compbio.washington.edu/~zach/py_graph/doc/html/public/py_graph... >>> >>> and many others..some of the above already seem to be very useful. >> >> There's mine too: >> http://sourceforge.net/projects/pynetwork/ >> API: >> http://code.activestate.com/recipes/466329/ >> >> Bye, >> bearophile > > Huh, I don't think I've ever seen that before, and I'm pretty > sure I'd remember if I had. With your permission, I'd like to > go ahead and start integrating some of the features from > that into graphine, especially a topo traversal. Do you > mind? > > Geremy Condra > Since that's released under the python license, I'm going to go ahead and commit the version that includes the topo traversal, but if you have any objections you only need to say the word and I'll take it down. Geremy Condra -- http://mail.python.org/mailman/listinfo/python-list
Re: KeyboardInterrupt
On Thu, 10 Dec 2009 00:29:45 +, mattia wrote: > Il Wed, 09 Dec 2009 16:19:24 -0800, Jon Clements ha scritto: > >> On Dec 9, 11:53 pm, mattia wrote: >>> Hi all, can you provide me a simple code snippet to interrupt the >>> execution of my program catching the KeyboardInterrupt signal? >>> >>> Thanks, >>> Mattia >> >> Errr, normally you can just catch the KeyboardInterrupt exception -- is >> that what you mean? >> >> Jon. > > Ouch, so the simplest solution is just insert in the 'main' function a > try/catch? I believed there was the necessity to create a signal and > than attach the KeyboardInterrupt to it... KeyboardInterrupt is just an exception that gets raised when CTLR+C (or the OS's equivalent keyboard combo) gets pressed. It can occur at any point in a script since you never know when the user will press it, which is why you put the try: except KeyboardInterrupt: around as much of your script as possible. The signal that the OS sends to the Python interpreter is irrelevant. -- Brad Harms -- http://alphaios.net -- http://mail.python.org/mailman/listinfo/python-list
Re: Python for Newbies
> The N900 is what I consider the coolest portable device ever: > > http://temporaryland.wordpress.com/2009/10/09/nokian900-not-just-an-itoy/ > > http://www.themaemo.com/and-now-for-something-completely-different-the-n900-and-its-killer-feature/ Dunno if you intended to, but in the last link you imply that you can't run Python on android, when you can do so either via ASE or through the JNI. Geremy Condra -- http://mail.python.org/mailman/listinfo/python-list
Re: Python for Newbies
* rm: On Dec 9, 9:46 pm, "Alf P. Steinbach" wrote: * rm: Here is a new tutorial that may be a good starting point for learning Python. http://www.themaemo.com/python-for-newbies/ Looks nice. I have two comments: (1) what is "the N900"?, and (2) the naming convention, using 'Num' for a variable and 'clsAddress' for a class, is opposite of the usual Python convention where one'd write 'num' and 'Address'. Shameless plug for my own writings, an introduction to /programming/ for newbies, using Python -- this work is progressing slowly but steadily: http://preview.tinyurl.com/ProgrammingBookP3> which is in Google Docs; a table of contents available as text file (it's not complete wrt. to latest stuff I added) and also in the PDF files themselves. Comments very welcome! :-) Cheers, - Alf PS: The last three or four paragraphs in ch 2 were sort of negative so I've replaced them with one single short much more upbeat paragraph. Working... One of the reasons I started writing this tutorial was because I found the lot of existing tutorials lacking in their approachability by people new to programming. Just about all of them were either not comprehensive enough, or seemed written by geniuses for geniuses. I hope you will allow me to quote a little excerpt from your tutorial that makes my point quite eloquently: "I have to use as-yet-unexplained language features in order to present examples that do relevant things, because it would be too much to explain the language features & concepts here. These features are explained in later chapters, so for now you can just adopt a very casual attitude, hey, it works!" Don't get me wrong, your approach probably works for a certain type of people. But there are a lot of us that find this approach very difficult to follow. The approach of this tutorial is gradually introduce new concepts so that the student can follow along at a logical and pleasant pace. Well, we agree on that. :-) You just quoted the above a little out of context. It's about the code examples in ch 1. Ch 1 is /not/ about programming: it's about tool usage, getting started, and next to nothing about the language or programming is discussed. So from my POV as author that criticism is like criticizing a bus driver for not explaining the technical workings of the bus when he's taking potential new bus drivers on a tour of the bus routes they may/will be driving later. Of course if the potential new drivers expect to be educated about the bus' technical stuff on that tour, just ignoring or not registering the up-front information about the tour, then they may grumble about only being shown some scenery, and what's this all about places and distances and routes? So, I think you read that with wrong expectations. Yes, it has a disadvantage. The examples can't be too elaborate. But here we disagree somewhat. If you look at ch 2 you'll see that with Python examples can be quite impressive without using more than just the tiniest little subset of the language. That is, when one has room to discuss things (difficult in an web based tutorial like yours, or like my once-upon-a-time C++ tutorial, but now I do have that room for discussion and guidance!) then a student's first examples do not need to be text only or dry academic. :-) But, the purpose of tutorial, to teach the language, is better accomplished this way. If I was teaching a group of people the English language, I would not go about doing so with a George Gordon Byron poem. Oh, I think you should! Especially considering that his daughter Augusta Ada was the world's first programmer and could be suspected of having an affair with Augustus de Morgan (who together with George Boole invented boolean logic, they published their works in the same week, and anyway was Augusta's private math tutor). Or perhaps start more easy, with Augustus de Morgan's infamous recursive fleas poem (ah, one may suspect some connection to Lord Byron there)! Cheers, - Alf -- http://mail.python.org/mailman/listinfo/python-list
Re: Graph library for Python
On Wed, Dec 9, 2009 at 8:59 PM, Bearophile wrote: > Robin Becker: > >> There are already very many implementations eg >> >> http://code.google.com/p/igraphhttp://www.boost.org/doc/libs/release/libs/graphhttp://ernst-schroeder.uni.lu/Digraph/doc/http://code.google.com/p/python-graphhttp://compbio.washington.edu/~zach/py_graph/doc/html/public/py_graph... >> >> and many others..some of the above already seem to be very useful. > > There's mine too: > http://sourceforge.net/projects/pynetwork/ > API: > http://code.activestate.com/recipes/466329/ > > Bye, > bearophile Huh, I don't think I've ever seen that before, and I'm pretty sure I'd remember if I had. With your permission, I'd like to go ahead and start integrating some of the features from that into graphine, especially a topo traversal. Do you mind? Geremy Condra -- http://mail.python.org/mailman/listinfo/python-list
Re: Python for Newbies
On Dec 9, 9:46 pm, "Alf P. Steinbach" wrote: > * rm: > > > Here is a new tutorial that may be a good starting point for learning > > Python. > > >http://www.themaemo.com/python-for-newbies/ > > Looks nice. > > I have two comments: (1) what is "the N900"?, and (2) the naming convention, > using 'Num' for a variable and 'clsAddress' for a class, is opposite of the > usual Python convention where one'd write 'num' and 'Address'. > > Shameless plug for my own writings, an introduction to /programming/ for > newbies, using Python -- this work is progressing slowly but steadily: > > http://preview.tinyurl.com/ProgrammingBookP3> > > which is in Google Docs; a table of contents available as text file (it's not > complete wrt. to latest stuff I added) and also in the PDF files themselves. > > Comments very welcome! :-) > > Cheers, > > - Alf > > PS: The last three or four paragraphs in ch 2 were sort of negative so I've > replaced them with one single short much more upbeat paragraph. Working... One of the reasons I started writing this tutorial was because I found the lot of existing tutorials lacking in their approachability by people new to programming. Just about all of them were either not comprehensive enough, or seemed written by geniuses for geniuses. I hope you will allow me to quote a little excerpt from your tutorial that makes my point quite eloquently: "I have to use as-yet-unexplained language features in order to present examples that do relevant things, because it would be too much to explain the language features & concepts here. These features are explained in later chapters, so for now you can just adopt a very casual attitude, hey, it works!" Don't get me wrong, your approach probably works for a certain type of people. But there are a lot of us that find this approach very difficult to follow. The approach of this tutorial is gradually introduce new concepts so that the student can follow along at a logical and pleasant pace. Yes, it has a disadvantage. The examples can't be too elaborate. But, the purpose of tutorial, to teach the language, is better accomplished this way. If I was teaching a group of people the English language, I would not go about doing so with a George Gordon Byron poem. -- http://mail.python.org/mailman/listinfo/python-list
Re: Python for Newbies
On Dec 9, 9:46 pm, "Alf P. Steinbach" wrote: > * rm: > > > Here is a new tutorial that may be a good starting point for learning > > Python. > > >http://www.themaemo.com/python-for-newbies/ > > Looks nice. > > I have two comments: (1) what is "the N900"?, and (2) the naming convention, > using 'Num' for a variable and 'clsAddress' for a class, is opposite of the > usual Python convention where one'd write 'num' and 'Address'. > > Shameless plug for my own writings, an introduction to /programming/ for > newbies, using Python -- this work is progressing slowly but steadily: > > http://preview.tinyurl.com/ProgrammingBookP3> > > which is in Google Docs; a table of contents available as text file (it's not > complete wrt. to latest stuff I added) and also in the PDF files themselves. > > Comments very welcome! :-) > > Cheers, > > - Alf > > PS: The last three or four paragraphs in ch 2 were sort of negative so I've > replaced them with one single short much more upbeat paragraph. Working... The N900 is what I consider the coolest portable device ever: http://temporaryland.wordpress.com/2009/10/09/nokian900-not-just-an-itoy/ http://www.themaemo.com/and-now-for-something-completely-different-the-n900-and-its-killer-feature/ This tutorial is also a work in progress. We welcome the help. In fact there is a Google Wave already set up for this purpose. I'll take a look at your writings. What license are you making them available with. -- http://mail.python.org/mailman/listinfo/python-list
Re: Python for Newbies
Alf P. Steinbach wrote: * rm: Here is a new tutorial that may be a good starting point for learning Python. http://www.themaemo.com/python-for-newbies/ Looks nice. I have two comments: (1) what is "the N900"?, and (2) the naming convention, using 'Num' for a variable and 'clsAddress' for a class, is opposite of the usual Python convention where one'd write 'num' and 'Address'. [snip] (1) Nokia N900. (2) I agree that the naming convention is nonPythonic. -- http://mail.python.org/mailman/listinfo/python-list
Re: switch
On Dec 9, 5:02 pm, Asun Friere wrote: > On Dec 9, 7:08 pm, Carl Banks wrote: > > > What if the object is a string you just read from a file? > > > How do you dispatch using polymorphism in that case? > > This would be a pertinent question, were I advocating that _all_ > switch statements should, or even can, be replaced with "dispatch > using polymorphism." Then why did you claim that a decent OO should never have a switch statement then? You argued that a decent language OO should never have a switch statement because polymorphic dispatch is the right way to handle it in OO languages, which implies that polymorphism can and should take the place of any switch statement. > What if, instead of reading strings from a file, Why don't you answer my question first, then I'll entertain whatever point you are trying to make with this example? Carl Banks -- http://mail.python.org/mailman/listinfo/python-list
Re: Python for Newbies
* rm: Here is a new tutorial that may be a good starting point for learning Python. http://www.themaemo.com/python-for-newbies/ Looks nice. I have two comments: (1) what is "the N900"?, and (2) the naming convention, using 'Num' for a variable and 'clsAddress' for a class, is opposite of the usual Python convention where one'd write 'num' and 'Address'. Shameless plug for my own writings, an introduction to /programming/ for newbies, using Python -- this work is progressing slowly but steadily: http://preview.tinyurl.com/ProgrammingBookP3> which is in Google Docs; a table of contents available as text file (it's not complete wrt. to latest stuff I added) and also in the PDF files themselves. Comments very welcome! :-) Cheers, - Alf PS: The last three or four paragraphs in ch 2 were sort of negative so I've replaced them with one single short much more upbeat paragraph. Working... -- http://mail.python.org/mailman/listinfo/python-list
Python for Newbies
Here is a new tutorial that may be a good starting point for learning Python. http://www.themaemo.com/python-for-newbies/ -- http://mail.python.org/mailman/listinfo/python-list
Re: Graph library for Python
Robin Becker: > There are already very many implementations eg > > http://code.google.com/p/igraphhttp://www.boost.org/doc/libs/release/libs/graphhttp://ernst-schroeder.uni.lu/Digraph/doc/http://code.google.com/p/python-graphhttp://compbio.washington.edu/~zach/py_graph/doc/html/public/py_graph... > > and many others..some of the above already seem to be very useful. There's mine too: http://sourceforge.net/projects/pynetwork/ API: http://code.activestate.com/recipes/466329/ Bye, bearophile -- http://mail.python.org/mailman/listinfo/python-list
Re: Immediate Help with python program!
On Dec 9, 6:50 pm, MRAB wrote: > Daniel wrote: > > i am making a tic-tac-toe game using python. i am pretty new to it, > > but cant seem to figure this one out. > > Here is my code: > > [snip] > You problem is due to your choice of variable names, because '0' looks > too much like 'O'. > > You also don't define 'ask'. Appreciate the help guys. Sorry about postin it here, mistake on my part. Thanks again. -- http://mail.python.org/mailman/listinfo/python-list
Re: switch
On Dec 9, 7:08 pm, Carl Banks wrote: > What if the object is a string you just read from a file? > > How do you dispatch using polymorphism in that case? This would be a pertinent question, were I advocating that _all_ switch statements should, or even can, be replaced with "dispatch using polymorphism." What if, instead of reading strings from a file, you are parsing, say xml, into an object framework isomorphic to the file's schema? And no, this is not a contrived example. Now you want to print out the structure, or a branch thereof. To make matters interesting you want to be able to print it out in a number of different formats. So we have: 5 def print_out (element, fmnt) : 6 if element.__class__ is schema.Title : 7 if str(fmnt) == 'html' : 8 print_out_spam_title(element) 9 elif str(fmnt) == 'txt' : 10 print_out_ham_title(element) 11 elif 12 elif element.__class__ is schema.Paragraph : 13 if str(fmnt) == 'html' : 14 print_out_spam_paragraph(element) 15 elif str(fmnt) == 'txt' : 16 print_out_ham_paragraph(element) 17 elif ... 18 elif element.__class__ is ... 19 ... 20 And so on for a dozen or so tags and 3 formats. And imagine the joy of adding the 4th or 5th format. Now I guess you already realise that applying a dispatch mechanism here will improve the design and result in code that is dryer, far more easily extensible and arguably (but only arguably) more readible? -- http://mail.python.org/mailman/listinfo/python-list
Re: Immediate Help with python program!
Daniel wrote: i am making a tic-tac-toe game using python. i am pretty new to it, but cant seem to figure this one out. Here is my code: [snip] You problem is due to your choice of variable names, because '0' looks too much like 'O'. You also don't define 'ask'. -- http://mail.python.org/mailman/listinfo/python-list
Re: switch
On Dec 9, 5:39 pm, Steven D'Aprano wrote: > On Tue, 08 Dec 2009 21:36:23 -0800, Asun Friere wrote: > > On Dec 9, 4:02 pm, Kee Nethery wrote: > >> I string together a bunch of elif statements to simulate a switch > > >> if foo == True: > >> blah > >> elif bar == True: > >> blah blah > >> elif bar == False: > >> blarg > >> elif > > > This code is probably symptomatic of poor design. (Not to mention that > > your condition tests). For which reason python has no 'case' statement > > and why no decent OO language should. > > That's a provocative statement. > My reply was lost in the aether, so here goes again. If it's provocative, it is at least hedged. It is merely symptomatic and only probably so, because there are numerous instances where case logic is the only sensible solution. I'm not advocating some cargo- cult rule for the elimination of all uses of elif. If I were I would rightly be presented with numerous code examples where a switch is a sensible option, much as happens when someone pronounces against the humble goto statement. > > It is a principle of OO design that "an object should know what to do > > itself." Rather running an object though a series of tests, it is > > better to send the object a message, relying on polymorphism or duck- > > typing, and deal with any exceptions thrown. > > Perhaps that's true, but you'll note that the example given above doesn't > run a single object through a series of tests, but runs a series of tests > on DIFFERENT objects, to find the first which matches. > Well actually two objects with one being tested twice. But you are right, I was being sloppy when I wrote "running an object" especially in light of the fact that the following clause makes more sense when run against objects of potentially different class. Same for dispatch mechanisms of course. What I'm saying is that when you find a large if/elif/else in your code, regard it with suspicion and "consider" whether better design might not eliminate it. And I'm speaking as someone who still has to maintain some code (in perl not python) which has an if/elif/else statement spanning 5 A4 pages. What's worse, I was the one who did this to myself some 8 years ago. What I'm also saying is "learn about dispatch mechanisms," they are about the most useful patterns out there (next to the State pattern). As a matter of practice I have found that more often than not, large case statements can better be solved using double-dispatch. Obviously not all. Obviously! > But putting that aside, I find myself wondering how you would deal with > the following switch-like series of tests. > > def print_grades(score): > if not 0 <= score <= 100: > raise ValueError("score must be between 0 and 100") > if score < 50: > print "You have failed." > consider_suspension() > elif score == 50: > print "You have just passed by the skin of your teeth." > elif score < 60: > print "You have scored a D. You need to try harder." > elif score < 70: > print "You have scored a C." > elif score < 80: > print "You have scored a B. Well done." > elif score < 100: > print "Congratulations, you have scored an A." > else: > assert score == 100 > print "You have scored a PERFECT 100% SCORE!!!" > if not evidence_of_cheating(): > call_newspapers() > > Obviously that could, with a non-trivial amount of work, be turned into a > dictionary dispatch, but is the benefit worth the extra effort? > Probably not. Depending on the nature of the app, I'd probably be calling score.print_grades() and using cutoff values of 85, 75, 60 and 50 (perhaps not even hardcoded into the logic), but sure this is a fine example of a place where a solution other than a simple switch would be overkill. As such this example would be a good counter to the absolute repudiation of case logic I did not make. I doubt, however, that it is of great pedagogic value in alerting programmers to the design options available to them in overcomming what the perceive as a lack in the language. -- http://mail.python.org/mailman/listinfo/python-list
Re: Graph library for Python
>> Generally, we've tried to discourage people from instantiating >> nodes and edges directly, in favor of having them controlled >> through the graph. Maybe something along the lines of: >> >> g = Graph(nodes=['a', 'b', 'c'], edges=[('a', 'b'), ('a', 'c'), ('b', 'c')]) >> >> ? > > That would work as well, but you then miss out on the extra > parameters you can pass to Edge() and Node(). Just pushed a change that will allow that. > In another email you wrote that Edge() and Node() constructors > should not be used directly, since they have to know the Graph > to which they belong. > > Wouldn't it be possible to implement this kind of parent- > referencing in a lazy way, ie. by postponing all the init- > processing until the Graph instance is known ? While possible, I'm wary of this. We tried it in an initial prototype (all nodes and edges descended naturally from a Universe graph until otherwise stated) and that way lie madness. Perhaps at some point someone would like to give another shot at it, though. >> Beware, that doesn't just match nodes. >> >> g = Graph() >> g.add_node('a') >> g.add_node('b') >> g.add_edge('a', 'b', 'ab') >> 'ab' in g # returns true > > I'd avoid such an ambiguity. It could easily hide programming > errors (testing for edges instead of nodes). > > OTOH, you could also regard the graph as a set of nodes > and edges (as you apparently already do). In that case, > you'd define > > for x in g: print x > > as iteration of both nodes and edges in some arbitrary > order and then use the more specific: > > for n in g.nodes: print x > for e in g.edges: print x > > for iteration over just the nodes or edges. Yup, that's exactly what we do. >> g.get_edge_attributes('weight', 'color') >>> {"ab": {"weight": 3, "color": "blue"}, >>> "ac": {"weight": 2, "color": "green"}, >>> "bc": {"weight": 1, "color": "red"}} >>> >>> Again, the idea is to reduce call overhead and later >>> on be able to move these lookups to C. >> >> Entirely doable, but I'm not sure I see the use case. >> Would you mind providing a more realistic example? > > The idea is that you use the Graph representation of the > data to implement some algorithm e.g. optimizing weights > for example. > > The algorithm could be implemented in C to be fast enough > for large data sets. > > The above two methods would then be used to quickly push the > original data into the graph and extract it again after > the algorithm has run. I can see this, but I think the cleaner way is just to iterate over nodes and edges. Having said that, if somebody wants to come up with some timing data and it seems to provide a big advantage, I think robbie for one would make the change. >> Hmm. Sounds like a plausible use case to me, although I'm >> not sure its one that should be encouraged. The bigger >> question in my mind is whether all attribute lookups should >> have to pay the extra lookup cost to support a somewhat >> narrow need. I'll definitely have to talk with the other devs >> about this one, and run a little bit of timing besides. > > This would only be an optional second way of accessing > the .data dictionary. > > node.data['pass'] = 1 > node.data['from'] = 'Las Vegas' > node.data['to'] = 'New York' > > would work without such modifications. Yes, but the change is not reflected on the node. For example: >>> g = Graph(nodes={'a':{'spotted':True}}) >>> g['a'].data['spotted'] = False >>> g['a'].data['spotted'] True I can see how this would represent a gotcha, though. Is there a general opinion on whether this is a plus or a minus? Geremy Condra -- http://mail.python.org/mailman/listinfo/python-list
web crawler in python
I'm currently planning on writing a web crawler in python but have a question as far as how I should design it. My goal is speed and maximum efficient use of the hardware\bandwidth I have available. As of now I have a Dual 2.4ghz xeon box, 4gb ram, 500gb sata and a 20mbps bandwidth cap (for now) . Running FreeBSD. What would be the best way to design the crawler? Using the thread module? Would I be able to max out this connection with the hardware listed above using python threads? Thank you kindly. -- http://mail.python.org/mailman/listinfo/python-list
Re: Immediate Help with python program!
Ahem. This is a newsgroup/mailing list, not IM. I happen to have seen this within half an hour of you posting it, but that's just luck. Expecting an "immediate" response is unrealistic. Furthermore, this is comp.lang.python, a group right up there in pedantry terms with cam.misc. Wandering in and demanding "immediate" help is just begging for half a dozen replies that give you detailed and mind-boggling versions of exactly what you asked for, especially if it's got nothing to do with the answer you actually need. So... On Wed, 09 Dec 2009 23:55:01 -, Daniel wrote: i am making a tic-tac-toe game using python. i am pretty new to it, but cant seem to figure this one out. Here is my code: X = "X" O = "O" empty = " " tie = "Tie" squares = 9 There's a convention (PEP 8, why not go to www.python.org and read it?) that constants should be given names in CAPITAL_LETTERS_AND_UNDERSCORES so that you can tell at a glance that they aren't supposed to be changed. PEP 8 also has things to say about function names. [snip rest of program] Here is my problem: If you hit 'n' at the beginning prompt, the computer does four moves automatically and wins- you can't input anything. Sounds like you have a bug in your end-of-turn function. To be fair, it took me a couple of minutes to be sure I'd spotted this correctly. If you hit 'y' at the beginning prompt, you can play but cannot win. I got three x's in a row and it didn't let me win. It just keeps letting you input numbers until the computer wins even if you have three in a row. Sounds like you have a bug in your check-for-a-win function. That should be all the hint you need. -- Rhodri James *-* Wildebeest Herder to the Masses -- http://mail.python.org/mailman/listinfo/python-list
Re: Recommendation for small, fast, Python based web server
On Dec 9, 4:05 pm, pyt...@bdurham.com wrote: > Daniel, > > > I'm using cherrypy for this purpose, actually together with turbogears 1. > > My research has constantly pointed back to cherrypy as a tool of choice > for building local web servers. My initial impression was that cherrypy > was too big and complicated for my simple task. However, I'm going to > re-examine this assumption and take another look at cherrypy. > > Thanks for your help! > > Regards, > Malcolm tornado all the way, it is teh radness: http://www.tornadoweb.org/ epoll based python server. fun to hack on. def check it out. -- http://mail.python.org/mailman/listinfo/python-list
Re: Graph library for Python
On Wed, Dec 9, 2009 at 7:02 PM, Rhodri James wrote: > On Wed, 09 Dec 2009 23:42:13 -, geremy condra > wrote: > >> On Wed, Dec 9, 2009 at 6:04 PM, Rhodri James >> wrote: >>> >>> On Wed, 09 Dec 2009 03:47:03 -, geremy condra >>> wrote: > g = Graph( nodes={'a':{'colour':'red'}, 'b':{'colour':'white'}, 'c':{'colour':'blue'}}, edges={('a', 'b'):{'name':'ab', 'weight':2}, ('a', 'c'):{'name':'ac'}, ('b', 'c'):{'name':'bc', 'style':'dotted'}} ) >>> >>> That's OK for nodes, but for consistency with add_edges I would have >>> expected the name to be the optional third element of the key tuples. It >>> works either way, but I can't help feel it's beginning to look a bit >>> ugly. >> >> I have to admit, I prefer it the other way, but patrick (our test guru and >> chief bug squasher) likes your proposal better. I'm going to get in touch >> with robbie tonight and see what he says. Since this is not a feature I'll >> use much, if he agrees with you then I'll go ahead and implement the >> change tonight and merge it back into mainline. If not, I'd appreciate >> it if you'd take another look at it and figure out if its something you >> can >> live with, or if theres another syntax you'd prefer, etc. Fair enough? > > Fair enough. Don't take my word as having much weight; I'm not likely to > use graphs much for graph theory purposes (having skipped the topology > courses in the Maths part of my degree), it just happens to be clearly the > right datastructure for a project I'm fiddling with at home. > > Here's a thought: are > > g.add_edge("a", "b", "ab") > > and > > g.add_edge("a", "b", name="ab") > > equivalent? If so, there's no reason not to have both forms of the > initialiser. If not, that weighs against having 'name' as a dictionary key. You're right, of course- the obvious way to do this is just to apply tuple unpacking to each element in the edges argument. I've applied the change, although testing and documentation will need to be updated before I can merge it back into mainline, and I doubt I'll get to that tonight. Geremy Condra -- http://mail.python.org/mailman/listinfo/python-list
Re: Immediate Help with python program!
On Dec 9, 5:18 pm, Jon Clements wrote: > Someone's homework assignment is overdue/due very soon? And, I don't > believe for a second this is your code. In fact, just searching for > (the obvious Java based) function names leads me to believe you've > 'butchered' it from Java code (do you not think your teacher/lecturer > can do the same?). > > Someone might well help out, but I'd be surprised if you got a "here's > how to fix it response", as from my POV you haven't done any work. > > Of course, I'm occasionally wrong, > > Jon. I also got the impression that it was a homework assignment. I'll just add that trying to bring attention to your request for help with exclamation points and words that indicate urgency is pretty bad form in a volunteer support community. -- http://mail.python.org/mailman/listinfo/python-list
Re: Immediate Help with python program!
On Dec 9, 6:18 pm, Jon Clements wrote: > On Dec 9, 11:55 pm, Daniel wrote: > > > > > i am making a tic-tac-toe game using python. i am pretty new to it, > > but cant seem to figure this one out. > > Here is my code: > > > X = "X" > > O = "O" > > empty = " " > > tie = "Tie" > > squares = 9 > > > def display(): > > print """Welcome to Tic-Tac-Toe. Player will play against the > > computer. > > \nYou will move by typing in the number to the > > corresponding square below: > > > 0 | 1 | 2 > > - > > 3 | 4 | 5 > > - > > 6 | 7 | 8 \n""" > > > def select(): > > question = ask("Do you want to go first? (y/n)") > > if question == "y": > > player = X > > computer = O > > else: > > computer = X > > player = O > > return computer, player > > > def newBoard(): > > board = [] > > for i in range(squares): > > board.append(empty) > > return board > > > def displayBoard(board): > > print "\n\t", board[0], "|", board[1], "|", board[2] > > print "\t", "-" > > print "\t", board[3], "|", board[4], "|", board[5] > > print "\t", "-" > > print "\t", board[6], "|", board[7], "|", board[8], "\n" > > > def boardMoves(board): > > moves = [] > > for i in range(squares): > > if board[i] == empty: > > moves.append(i) > > return moves > > > def findWinner(board): > > win = ((0, 1, 2), > > (3, 4, 5), > > (6, 7, 8), > > (0, 3, 6), > > (1, 4, 7), > > (2, 5, 8), > > (0, 4, 8), > > (2, 4, 6)) > > > for i in win: > > if board[i[0]] == board[i[1]] == board[i[2]] != empty: > > winner = board[i[0]] > > return winner > > if empty not in board: > > return tie > > return None > > > def askMove(question, low, high): > > response = None > > while response not in range(low, high): > > response = int(raw_input(question)) > > return response > > > def playerMove(board, player): > > legal = boardMoves(board) > > move = None > > while move not in legal: > > move = askMove("Pick a number where you want to move(0-8):", > > 0, squares) > > if move not in legal: > > print "\nThat move is taken already. Pick another." > > return move > > > def compMove(board, computer, player): > > board = board[:] > > strategy = (4, 0, 2, 6, 8, 1, 3, 5, 7) > > print "Computer chooses:", > > > # if computer can win, take that move > > for move in boardMoves(board): > > board[move] = computer > > if findWinner(board) == computer: > > print move > > return move > > board[move] = empty > > > # if human can win, block that move > > for move in boardMoves(board): > > board[move] = player > > if findWinner(board) == player: > > print move > > return move > > board[move] = empty > > > # If no one can win pick best open square > > for move in strategy: > > if move in boardMoves(board): > > print move > > return move > > > def nextTurn(turn): > > if turn == X: > > return 0 > > else: > > return X > > > def gameWinner(winner, computer, player): > > if winner == computer: > > print "Computer Wins. Better luck next time" > > elif winner == player: > > print "You win. Good job!" > > elif winner == tie: > > print "Tie game. Play again." > > > def main(): > > display() > > computer, player = select() > > turn = X > > board = newBoard() > > displayBoard(board) > > > while not findWinner(board): > > if turn == player: > > move = playerMove(board, player) > > board[move] = player > > else: > > move = compMove(board, computer, player) > > board[move] = computer > > displayBoard(board) > > turn = nextTurn(turn) > > winner = findWinner(board) > > gameWinner(winner, computer, player) > > > main() > > > Here is my problem: > > If you hit 'n' at the beginning prompt, the computer does four moves > > automatically and wins- you can't input anything. If you hit 'y' at > > the beginning prompt, you can play but cannot win. I got three x's in > > a row and it didn't let me win. It just keeps letting > > you input numbers until the computer wins even if you have three in a > > row. > > > If anyone can help please do asap. > > Thank you! > > Someone's homework assignment is overdue/due very soon? And, I don't > believe for a second this is your code. In fact, just searching for > (the obvious Java based) function names leads me to believe you've > 'butchered' it from Java code (do you not think your teacher/lecturer
Re: Graph library for Python
On Wed, Dec 9, 2009 at 4:02 PM, Rhodri James wrote: > > Here's a thought: are > > g.add_edge("a", "b", "ab") > > and > > g.add_edge("a", "b", name="ab") > > equivalent? If so, there's no reason not to have both forms of the > initialiser. If not, that weighs against having 'name' as a dictionary key. > > > -- > Rhodri James *-* Wildebeest Herder to the Masses > -- > http://mail.python.org/mailman/listinfo/python-list > Both methods are equivalent. Patrick Laban -- http://mail.python.org/mailman/listinfo/python-list
Re: Graph library for Python
geremy condra wrote: > On Mon, Dec 7, 2009 at 6:28 PM, M.-A. Lemburg wrote: * Graph.__init__ should be able to take a list or set of nodes and edges as initializer >>> >>> The format of this will need to be thought all the way >>> through before being implemented. To date, we haven't >>> come up with anything completely satisfactory, but >>> AFAIK everybody involved is still open to suggestions >>> on this. >> >> I wasn't thinking of anything clever :-) ... >> >> g = Graph( >> [Node("a"), Node("b"), Node("c")], >> [Edge(Node("a"), Node("b"), "ab"), >> Edge(Node("a"), Node("c"), "ac"), >> Edge(Node("b"), Node("c"), "bc"), >> ]) >> >> The main motivation here is to get lists, sets and dicts >> play nice together. > > Generally, we've tried to discourage people from instantiating > nodes and edges directly, in favor of having them controlled > through the graph. Maybe something along the lines of: > > g = Graph(nodes=['a', 'b', 'c'], edges=[('a', 'b'), ('a', 'c'), ('b', 'c')]) > > ? That would work as well, but you then miss out on the extra parameters you can pass to Edge() and Node(). In another email you wrote that Edge() and Node() constructors should not be used directly, since they have to know the Graph to which they belong. Wouldn't it be possible to implement this kind of parent- referencing in a lazy way, ie. by postponing all the init- processing until the Graph instance is known ? * Graph.__setitem__ could be mapped to .add_node() for convenience >>> >>> This may be a question of playing around with it. ATM I'm >>> not sold on the idea, but I'll implement it and see how it >>> turns out in practice. >> >> Thinking about it some more, I agree, it's not all that useful. >> * Graph.__length__ could be mapped to .size() for convenience >>> >>> We decided not to do this due to the ambiguity between >>> whether .size() or .order() was the intended operation, >>> and looking back I'm not sure that was entirely unjustified. >>> Do you see there being any confusion on that score? >> >> There is an ambiguity here, indeed. My thinking was that >> the edges define the graph and can be mapped to a dictionary, >> e.g. >> >> d = {"ab": ("a", "b"), >> "ac": ("a", "c"), >> "bc": ("b", "c")} >> >> len(d) == 3 >> len(g) == 3 >> >> A graph without edges is also what you typically call an empty >> graph, ie. >> >> if not g: >>print 'empty' >> >> http://mathworld.wolfram.com/EmptyGraph.html >> >> Still, perhaps it's better to just not go down this route. > > I'd rather avoid it if possible, since there are many > potential interpretations of this in different contexts. > Again, I'm open to to the idea, but not convinced. > * Graph.__iter__ could be mapped to an iterator using the fastest traversal method for the graph nodes (ie. order does not matter, it's only important that all nodes are found as fast as possible) >>> >>> Again, it seems ambiguous as to whether nodes or >>> edges are the intended target here, and while the >>> API can obviously dictate that, it seems a bit like >>> a case of "in the face of ambiguity, refuse the >>> temptation to guess" to me. >> >> Right, but sometimes "practicalty beats purity" ;-) We had >> the same situation for dictionaries and then decided that >> iteration over keys would be more natural than iterating over >> items (key, value) or values. >> >> It's also important to note that: >> >>for n in g: print n >> >> and >> >>n in g >> >> match up in terms of semantics. >> >> Since n in g already uses the "node in graph" approach, >> the for-loop should use the same logic. > > Beware, that doesn't just match nodes. > > g = Graph() > g.add_node('a') > g.add_node('b') > g.add_edge('a', 'b', 'ab') > 'ab' in g # returns true I'd avoid such an ambiguity. It could easily hide programming errors (testing for edges instead of nodes). OTOH, you could also regard the graph as a set of nodes and edges (as you apparently already do). In that case, you'd define for x in g: print x as iteration of both nodes and edges in some arbitrary order and then use the more specific: for n in g.nodes: print x for e in g.edges: print x for iteration over just the nodes or edges. * Graph could also benefit from some bulk update methods, e.g. to update weights on all edges or nodes by passing in a dictionary mapping names to attribute values >>> >>> Sounds good. Again, the format will need some careful >>> thought, but you're right that this would improve it >>> greatly. >> >> This is only an optimization, but could lead to some great >> performance improvements by avoiding function call overhead. > > Agreed. > * Graph could benefit from some bulk query methods, such as .get_node_attributes() and .add_edges(). >>> >>> I'm not sure how the first is different from the existing >>> .data, what did you have in mind? >> >> The second one was a t
Re: Immediate Help with python program!
On Dec 9, 11:55 pm, Daniel wrote: > i am making a tic-tac-toe game using python. i am pretty new to it, > but cant seem to figure this one out. > Here is my code: > > X = "X" > O = "O" > empty = " " > tie = "Tie" > squares = 9 > > def display(): > print """Welcome to Tic-Tac-Toe. Player will play against the > computer. > \nYou will move by typing in the number to the > corresponding square below: > > 0 | 1 | 2 > - > 3 | 4 | 5 > - > 6 | 7 | 8 \n""" > > def select(): > question = ask("Do you want to go first? (y/n)") > if question == "y": > player = X > computer = O > else: > computer = X > player = O > return computer, player > > def newBoard(): > board = [] > for i in range(squares): > board.append(empty) > return board > > def displayBoard(board): > print "\n\t", board[0], "|", board[1], "|", board[2] > print "\t", "-" > print "\t", board[3], "|", board[4], "|", board[5] > print "\t", "-" > print "\t", board[6], "|", board[7], "|", board[8], "\n" > > def boardMoves(board): > moves = [] > for i in range(squares): > if board[i] == empty: > moves.append(i) > return moves > > def findWinner(board): > win = ((0, 1, 2), > (3, 4, 5), > (6, 7, 8), > (0, 3, 6), > (1, 4, 7), > (2, 5, 8), > (0, 4, 8), > (2, 4, 6)) > > for i in win: > if board[i[0]] == board[i[1]] == board[i[2]] != empty: > winner = board[i[0]] > return winner > if empty not in board: > return tie > return None > > def askMove(question, low, high): > response = None > while response not in range(low, high): > response = int(raw_input(question)) > return response > > def playerMove(board, player): > legal = boardMoves(board) > move = None > while move not in legal: > move = askMove("Pick a number where you want to move(0-8):", > 0, squares) > if move not in legal: > print "\nThat move is taken already. Pick another." > return move > > def compMove(board, computer, player): > board = board[:] > strategy = (4, 0, 2, 6, 8, 1, 3, 5, 7) > print "Computer chooses:", > > # if computer can win, take that move > for move in boardMoves(board): > board[move] = computer > if findWinner(board) == computer: > print move > return move > board[move] = empty > > # if human can win, block that move > for move in boardMoves(board): > board[move] = player > if findWinner(board) == player: > print move > return move > board[move] = empty > > # If no one can win pick best open square > for move in strategy: > if move in boardMoves(board): > print move > return move > > def nextTurn(turn): > if turn == X: > return 0 > else: > return X > > def gameWinner(winner, computer, player): > if winner == computer: > print "Computer Wins. Better luck next time" > elif winner == player: > print "You win. Good job!" > elif winner == tie: > print "Tie game. Play again." > > def main(): > display() > computer, player = select() > turn = X > board = newBoard() > displayBoard(board) > > while not findWinner(board): > if turn == player: > move = playerMove(board, player) > board[move] = player > else: > move = compMove(board, computer, player) > board[move] = computer > displayBoard(board) > turn = nextTurn(turn) > winner = findWinner(board) > gameWinner(winner, computer, player) > > main() > > Here is my problem: > If you hit 'n' at the beginning prompt, the computer does four moves > automatically and wins- you can't input anything. If you hit 'y' at > the beginning prompt, you can play but cannot win. I got three x's in > a row and it didn't let me win. It just keeps letting > you input numbers until the computer wins even if you have three in a > row. > > If anyone can help please do asap. > Thank you! Someone's homework assignment is overdue/due very soon? And, I don't believe for a second this is your code. In fact, just searching for (the obvious Java based) function names leads me to believe you've 'butchered' it from Java code (do you not think your teacher/lecturer can do the same?). Someone might well help out, but I'd be surprised if you got a "here's how to fix it response", as from my POV you haven't done any work. Of course, I'm occasionally wrong, Jon. -- http://mail.python.org/mailman/listinfo/python-list
Re: Recommendation for small, fast, Python based web server
Daniel, > I'm using cherrypy for this purpose, actually together with turbogears 1. My research has constantly pointed back to cherrypy as a tool of choice for building local web servers. My initial impression was that cherrypy was too big and complicated for my simple task. However, I'm going to re-examine this assumption and take another look at cherrypy. Thanks for your help! Regards, Malcolm -- http://mail.python.org/mailman/listinfo/python-list
Re: Graph library for Python
On Wed, 09 Dec 2009 23:42:13 -, geremy condra wrote: On Wed, Dec 9, 2009 at 6:04 PM, Rhodri James wrote: On Wed, 09 Dec 2009 03:47:03 -, geremy condra wrote: g = Graph( nodes={'a':{'colour':'red'}, 'b':{'colour':'white'}, 'c':{'colour':'blue'}}, edges={('a', 'b'):{'name':'ab', 'weight':2}, ('a', 'c'):{'name':'ac'}, ('b', 'c'):{'name':'bc', 'style':'dotted'}} ) That's OK for nodes, but for consistency with add_edges I would have expected the name to be the optional third element of the key tuples. It works either way, but I can't help feel it's beginning to look a bit ugly. I have to admit, I prefer it the other way, but patrick (our test guru and chief bug squasher) likes your proposal better. I'm going to get in touch with robbie tonight and see what he says. Since this is not a feature I'll use much, if he agrees with you then I'll go ahead and implement the change tonight and merge it back into mainline. If not, I'd appreciate it if you'd take another look at it and figure out if its something you can live with, or if theres another syntax you'd prefer, etc. Fair enough? Fair enough. Don't take my word as having much weight; I'm not likely to use graphs much for graph theory purposes (having skipped the topology courses in the Maths part of my degree), it just happens to be clearly the right datastructure for a project I'm fiddling with at home. Here's a thought: are g.add_edge("a", "b", "ab") and g.add_edge("a", "b", name="ab") equivalent? If so, there's no reason not to have both forms of the initialiser. If not, that weighs against having 'name' as a dictionary key. -- Rhodri James *-* Wildebeest Herder to the Masses -- http://mail.python.org/mailman/listinfo/python-list
Re: Recommendation for small, fast, Python based web server
Tim, > I've used WebStack[1] for this in the past. It allows for stand-alone serving > as well as plugging nicely into various "real" servers (apache+mod_python, > etc) with a small tweak in how it's configured. Thanks for that recommendation. > I'm not sure what caused the slowness you've experienced (... with running > local versions of Python web servers) Thanks to a past post by "Christoph Zwerschke" , I was able to identify the problem. Windows (XP, Vista, Windows 7) tries to do a IPV6 connection which times out after a second followed by an IPV4 connection which is almost instantaneous. Apparently this is a known problem that is a Windows issue [1] - not a Python problem. Two workarounds: 1. Use 127.0.0.1 as your URL vs. localhost -OR- 2. Edit your Windows hosts file (c:\windows\system32\drivers\etc\hosts) and create a virtual domain name, eg. put the following on a line by itself: 127.0.0.1 mydomain.someext And then use mydomain.someext vs. localhost Note: Editing your hosts file requires admin rights under Vista and Windows 7. Regards, Malcolm [1] http://schotime.net/blog/index.php/2008/05/27/slow-tcpclient-connection-sockets/ -- http://mail.python.org/mailman/listinfo/python-list
Immediate Help with python program!
i am making a tic-tac-toe game using python. i am pretty new to it, but cant seem to figure this one out. Here is my code: X = "X" O = "O" empty = " " tie = "Tie" squares = 9 def display(): print """Welcome to Tic-Tac-Toe. Player will play against the computer. \nYou will move by typing in the number to the corresponding square below: 0 | 1 | 2 - 3 | 4 | 5 - 6 | 7 | 8 \n""" def select(): question = ask("Do you want to go first? (y/n)") if question == "y": player = X computer = O else: computer = X player = O return computer, player def newBoard(): board = [] for i in range(squares): board.append(empty) return board def displayBoard(board): print "\n\t", board[0], "|", board[1], "|", board[2] print "\t", "-" print "\t", board[3], "|", board[4], "|", board[5] print "\t", "-" print "\t", board[6], "|", board[7], "|", board[8], "\n" def boardMoves(board): moves = [] for i in range(squares): if board[i] == empty: moves.append(i) return moves def findWinner(board): win = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6)) for i in win: if board[i[0]] == board[i[1]] == board[i[2]] != empty: winner = board[i[0]] return winner if empty not in board: return tie return None def askMove(question, low, high): response = None while response not in range(low, high): response = int(raw_input(question)) return response def playerMove(board, player): legal = boardMoves(board) move = None while move not in legal: move = askMove("Pick a number where you want to move(0-8):", 0, squares) if move not in legal: print "\nThat move is taken already. Pick another." return move def compMove(board, computer, player): board = board[:] strategy = (4, 0, 2, 6, 8, 1, 3, 5, 7) print "Computer chooses:", # if computer can win, take that move for move in boardMoves(board): board[move] = computer if findWinner(board) == computer: print move return move board[move] = empty # if human can win, block that move for move in boardMoves(board): board[move] = player if findWinner(board) == player: print move return move board[move] = empty # If no one can win pick best open square for move in strategy: if move in boardMoves(board): print move return move def nextTurn(turn): if turn == X: return 0 else: return X def gameWinner(winner, computer, player): if winner == computer: print "Computer Wins. Better luck next time" elif winner == player: print "You win. Good job!" elif winner == tie: print "Tie game. Play again." def main(): display() computer, player = select() turn = X board = newBoard() displayBoard(board) while not findWinner(board): if turn == player: move = playerMove(board, player) board[move] = player else: move = compMove(board, computer, player) board[move] = computer displayBoard(board) turn = nextTurn(turn) winner = findWinner(board) gameWinner(winner, computer, player) main() Here is my problem: If you hit 'n' at the beginning prompt, the computer does four moves automatically and wins- you can't input anything. If you hit 'y' at the beginning prompt, you can play but cannot win. I got three x's in a row and it didn't let me win. It just keeps letting you input numbers until the computer wins even if you have three in a row. If anyone can help please do asap. Thank you! -- http://mail.python.org/mailman/listinfo/python-list
Re: Graph library for Python
On Wed, Dec 9, 2009 at 6:04 PM, Rhodri James wrote: > On Wed, 09 Dec 2009 03:47:03 -, geremy condra > wrote: > >> On Tue, Dec 8, 2009 at 8:42 PM, Rhodri James >> wrote: >>> >>> g = Graph( >>> nodes=[Node("a", colour="red"), >>> Node("b", colour="white"), >>> Node("c", colour="blue")], >>> edges=[Edge("a", "b", "ab", weight=2), >>> Edge("a", "c", "ac", is_directed=True), >>> Edge("b", "c", "bc", style="dotted")], >>> is_directed=True) >>> >>> I could see a use for this tracking a database structure using a constant >>> graph, hence all set up in one go for preference. >> >> While I agree with the rationale, I think we need to find another way. >> Aesthetics aside, directly instantiating edges by giving only node names >> requires that the edge be aware of what graph its in to provide expected >> behavior, which creates a bit of a chicken-or-the-egg dilemma. > > Oops. I missed that, sorry. > >> How about this: the constructor can take any type of iterable, and >> assumes that it follows my earlier format unless it specifies a .items() >> method, in which case it takes the values as follows: > > isinstance(x, collections.Mapping) is perhaps the right test? The code I kludged together last night just tries __getitem__ and it seems to work, so unless theres something I'm missing I'll probably just leave it at that. >> g = Graph( >> nodes={'a':{'colour':'red'}, >> 'b':{'colour':'white'}, >> 'c':{'colour':'blue'}}, >> edges={('a', 'b'):{'name':'ab', 'weight':2}, >> ('a', 'c'):{'name':'ac'}, >> ('b', 'c'):{'name':'bc', 'style':'dotted'}} >> ) > > That's OK for nodes, but for consistency with add_edges I would have > expected the name to be the optional third element of the key tuples. It > works either way, but I can't help feel it's beginning to look a bit ugly. I have to admit, I prefer it the other way, but patrick (our test guru and chief bug squasher) likes your proposal better. I'm going to get in touch with robbie tonight and see what he says. Since this is not a feature I'll use much, if he agrees with you then I'll go ahead and implement the change tonight and merge it back into mainline. If not, I'd appreciate it if you'd take another look at it and figure out if its something you can live with, or if theres another syntax you'd prefer, etc. Fair enough? Geremy Condra -- http://mail.python.org/mailman/listinfo/python-list
Re: Perl to Python conversion
Martin Schöön wrote: > Hence, are there any Perl to Python converters? So far I > have only found bridgekeeper which really is (was?) consultancy. > Apart from that I only find people recommending a manual re-write. > > Any thoughts/recommendations? Voice of almost no experience. I once ran a fortran programme through a fortran to c converter and when I saw the result I ran away screaming - it did not look very human friendly. -- http://www.petezilla.co.uk -- http://mail.python.org/mailman/listinfo/python-list
Re: Parsing json where object keys are not quoted?
On Dec 9, 3:51 pm, Wells wrote: > Is there some way to finagle the json module to parse JSON (well, > almost JSON) where the object keys are not in quotes? I know it's not > 100% valid JSON, but I'm just curious. > > I don't have control over the data, so I can't make it fit the spec :) Hopefully this won't be a recurring problem, because maintenance of any solution could very well be a nightmare if you have to keep it up. The JSON library that ships with Python doesn't appear to be built for malformed JSON like what you mention, and making it handle it will take a bit of work on your part, but here's a start (based on my 2.6.4 installation): In /path_to_python_standard_library/json/decoder.py (please back this up before making any changes), comment out the try/except block that tries to load scanstring from _json and duplicate the last line (c_scanstring = None), removing its indentation. You'll then need to modify py_scanstring() to meet your needs, but be sure you understand what it's doing first. You'll need to track whether you found the leading '"' for the key and look for the other one if you did, but just look for the ':' otherwise. Again, this isn't an advisable solution, and it won't work in all cases even if you have the best of luck, but it may just work in enough cases. It's pretty amazing that the incoming document doesn't match the spec, though. The only correct solution would be to fix the library that generated it. -- http://mail.python.org/mailman/listinfo/python-list
Re: Recommendation for small, fast, Python based web server
> I'm looking for a small, simple, fast, Python based web server > for a simple, client side application we're building. We don't > want to distrubute and support a "real" web server like Apache or > Tomcat or depend on the presence of local web server such as IIS. > The application in question will service AJAX requests from a > browser. > > We're not looking for a web framework like Django, Plone, etc. > > I've looked at the web servers that come bundled with the Python > standard library[1] and they are too slow. I suspect this is > because they don't maintain a session between the client and > server, thus every GET/POST request repeats the session setup and > break down process. Or they might be based on a polling model? > > Here are the other Python based web server implementations I'm > aware of: > - cherrypy > - web.py > - twisted > > Any recommendations appreciated (Python 2.6 preferred but open to > Python 3.1 options). I'm using cherrypy for this purpose, actually together with turbogears 1. Cheers, Daniel -- Psss, psss, put it down! - http://www.cafepress.com/putitdown -- http://mail.python.org/mailman/listinfo/python-list
Porting pyftpdlib to Python 3.x: question about tarball naming convention
Hi, I've started the (hard) process of porting pyftpdlib [1] to Python 3. In order to do that I'm working on a separate SVN branch and I plan to maintain two different releases of my software, one for 2.x and another one for 3.x. My doubts are about the naming convention I have to use for the tarball and how it affects the integration with distutils and setuptools. So far I've always used the following naming convention: pyftpdlib-0.5.2.tar.gz pyftpdlib-0.5.1.tar.gz pyftpdlib-0.4.1.tar.gz ... This way I'm able to download and "easy install" pyftpdlib by just doing: > easy_install pyftpdlib ...which retrieves the last pyftpdlib version (0.5.2, at the moment) from PYPI and installs it. Now that I'm going to have two major releases (pyftpdlib-0.5.2 for Python 2.x and pyftpdlib-0.5.2 for Python 3.x) how am I supposed to deal with that? Do I have to use a different name like "pyftpdlib-0.5.2-py3k.tar.gz" or "pyftpdlib-py3k-0.5.2.tar.gz"? How this affects the interaction with easy install? And again: in case it is possible to keep the same tarball name for both versions what am I gonna do with PYPI? Is it possible to host two programs with the same name on PYPI and just differentiate the description (e.g. "pyftpdlib version for python 2.x" / "pyftpdlib version for python 3.x") Thanks in advance [1] http://code.google.com/p/pyftpdlib -- http://mail.python.org/mailman/listinfo/python-list
Re: Brent's variation of a factorization algorithm
On 27-11-2009 16:36, n00m wrote: Maybe someone'll make use of it: def gcd(x, y): if y == 0: return x return gcd(y, x % y) def brent(n): [...] [D:\Projects]python brentfactor.py 9 == 27 * 37037037 What gives? Isn't this thing supposed to factor numbers into the product of two primes? -irmen -- http://mail.python.org/mailman/listinfo/python-list
Re: Graph library for Python
On Wed, 09 Dec 2009 03:47:03 -, geremy condra wrote: On Tue, Dec 8, 2009 at 8:42 PM, Rhodri James wrote: g = Graph( nodes=[Node("a", colour="red"), Node("b", colour="white"), Node("c", colour="blue")], edges=[Edge("a", "b", "ab", weight=2), Edge("a", "c", "ac", is_directed=True), Edge("b", "c", "bc", style="dotted")], is_directed=True) I could see a use for this tracking a database structure using a constant graph, hence all set up in one go for preference. While I agree with the rationale, I think we need to find another way. Aesthetics aside, directly instantiating edges by giving only node names requires that the edge be aware of what graph its in to provide expected behavior, which creates a bit of a chicken-or-the-egg dilemma. Oops. I missed that, sorry. How about this: the constructor can take any type of iterable, and assumes that it follows my earlier format unless it specifies a .items() method, in which case it takes the values as follows: isinstance(x, collections.Mapping) is perhaps the right test? g = Graph( nodes={'a':{'colour':'red'}, 'b':{'colour':'white'}, 'c':{'colour':'blue'}}, edges={('a', 'b'):{'name':'ab', 'weight':2}, ('a', 'c'):{'name':'ac'}, ('b', 'c'):{'name':'bc', 'style':'dotted'}} ) That's OK for nodes, but for consistency with add_edges I would have expected the name to be the optional third element of the key tuples. It works either way, but I can't help feel it's beginning to look a bit ugly. -- Rhodri James *-* Wildebeest Herder to the Masses -- http://mail.python.org/mailman/listinfo/python-list
Parsing json where object keys are not quoted?
Is there some way to finagle the json module to parse JSON (well, almost JSON) where the object keys are not in quotes? I know it's not 100% valid JSON, but I'm just curious. I don't have control over the data, so I can't make it fit the spec :) -- http://mail.python.org/mailman/listinfo/python-list
Re: How do I Block Events in wxPython
Wanderer wrote: Found another strange bug (Strange to me, anyway). int(0.8 * 10.0) 7. Had to change the code to int(0.8 * 10.0 + 0.0001). Floating point is intrinsically imprecise. The value 0.8 cannot be exactly represented in IEEE fp notation (binary). One answer is to round() the result before converting to int. DaveaA -- http://mail.python.org/mailman/listinfo/python-list
Python-URL! - weekly Python news and links (Dec 9)
QOTW: "I'm not sure you ever understood what the problem was, or where, but I'm happy you feel like you've solved it." - Marco Mariani http://groups.google.com/group/comp.lang.python/browse_thread/thread/8ec7ad4fcc714538 Python 2.7a1, the first alpha release of the 2.7 series, is available now: http://groups.google.com/group/comp.lang.python/t/743e13e80290fbbf/ A bidirectional dictionary structure analyzed: http://groups.google.com/group/comp.lang.python/t/785d100681f7d101/ How to define and use a nested class: http://groups.google.com/group/comp.lang.python/t/6649dfa6eb9797c8/ PyCon 2010 registration opens: http://pycon.blogspot.com/2009/11/registration-for-pycon-2010-is-open.html Why not have a local variable scope smaller than a function? http://groups.google.com/group/comp.lang.python/t/57a8dec0d5d5deda/ How to test whether two floating point values are "close enough" to be almost equal: http://groups.google.com/group/comp.lang.python/t/54ec18c06c46caaf/ A special notation for accessing dynamic attribute names: http://groups.google.com/group/comp.lang.python/t/2f5674a1f451b12f/ Computed attributes, properties, and the descriptor protocol "magic": http://groups.google.com/group/comp.lang.python/t/c07268689549cf01/ Name resolution, global names, importing modules, and how all of them interact: http://groups.google.com/group/comp.lang.python/t/55afecc0d9e3e6c/ http://groups.google.com/group/comp.lang.python/t/de91efba9c5d68ae/ Are there any high-volume Python-powered websites? http://groups.google.com/group/comp.lang.python/t/7e388f22cccf7c4b/ How decoupled are the Python web frameworks? http://groups.google.com/group/comp.lang.python/t/f04940f9d4b136bc/ Moving from Python 2 to Python 3: A "cheat sheet" by Mark Summerfield http://groups.google.com/group/comp.lang.python/t/53716c4136be473b/ The sheets: http://www.informit.com/promotions/promotion.aspx?promo=137519 Thoughts about bytecode optimization and measuring overhead of the eval loop: http://groups.google.com/group/comp.lang.python/t/115b24c0ee9ee06a/ Python as the starting point for a career on IT: http://groups.google.com/group/comp.lang.python/t/907419d0cdd68570/ Idea: get around the GIL using XMLRPC http://groups.google.com/group/comp.lang.python/t/9f84e7aa634de4f5/ Bored and looking for something to do in Python: http://groups.google.com/group/comp.lang.python/t/bba7c231bb9940a4/ Everything Python-related you want is probably one or two clicks away in these pages: Python.org's Python Language Website is the traditional center of Pythonia http://www.python.org Notice especially the master FAQ http://www.python.org/doc/FAQ.html PythonWare complements the digest you're reading with the marvelous daily python url http://www.pythonware.com/daily Just beginning with Python? This page is a great place to start: http://wiki.python.org/moin/BeginnersGuide/Programmers The Python Papers aims to publish "the efforts of Python enthusiasts": http://pythonpapers.org/ The Python Magazine is a technical monthly devoted to Python: http://pythonmagazine.com Readers have recommended the "Planet" site: http://planet.python.org comp.lang.python.announce announces new Python software. Be sure to scan this newsgroup weekly. http://groups.google.com/group/comp.lang.python.announce/topics Python411 indexes "podcasts ... to help people learn Python ..." Updates appear more-than-weekly: http://www.awaretek.com/python/index.html The Python Package Index catalogues packages. http://www.python.org/pypi/ Much of Python's real work takes place on Special-Interest Group mailing lists http://www.python.org/sigs/ Python Success Stories--from air-traffic control to on-line match-making--can inspire you or decision-makers to whom you're subject with a vision of what the language makes practical. http://www.pythonology.com/success The Python Software Foundation (PSF) has replaced the Python Consortium as an independent nexus of activity. It has official responsibility for Python's development and maintenance. http://www.python.org/psf/ Among the ways you can support PSF is with a donation. http://www.python.org/psf/donations/ The Summary of Python Tracker Issues is an automatically generated report summarizing new bugs, closed ones, and patch submissions. http://search.gmane.org/?author=status%40bugs.python.org&group=gmane.comp.python.devel&sort=date Althoug
Re: Request for py program to insert space between two characters and saved as text?
r0g wrote: Dave Angel wrote: r0g wrote: Dave Angel wrote: r0g wrote: Dave Angel wrote: r0g wrote: Dennis Lee Bieber wrote: On Tue, 8 Dec 2009 08:26:58 +0530, 74yrs old declaimed the following in gmane.comp.python.general: For Kannada project .txt(not .doc) is used, my requirement is to have one That's even worse. As far as I can tell, the code will never do what he wants in Python 2.x. The Kannada text file is full of Unicode characters in some encoding, and if you ignore the encoding, you'll just get garbage. Ah, fair enough. In my defence though I never saw the original post or this kannada.txt file as my newsserver is not so much with the reliability. I guess it's naive to assume an english .txt file is going to be in ASCII these days eh? I've yet to try python 3 yet either, this whole Unicode thing looks like it could be a total nightmare! :( Roger. But it isn't an english .txt file, it's a Kannada .txt file. Presumably you didn't realize that Kannada is a (non-English) language, spoken in parts of India, with several hundred characters. ASCII wasn't even an option. Anyway, no harm done, someone else referred the OP to a Python user-group local to that region. DaveA Well this looked like English to me... example: *F o r K a n n a d a p r o j e c t . t x t(n o t .d o c) i s u s e d, m y r e q u i r e m e n t i s t o h a v e o n e s p a c e b e t w e e n t w o c h a r a c t e r s i n t h e t e x t.* ...but yes you're right, I had never heard of Kannada let alone knew it was another language! Roger. There were two examples. The one you quoted was in English, and immediately afterward was the second one, presumably in Kannada. DaveA -- http://mail.python.org/mailman/listinfo/python-list
Re: UnboundLocalError: local variable '_[1]' referenced before assignment
Gabriel Rossetti wrote: Dave Angel wrote: Gabriel Rossetti wrote: Hello everyone, I get this error on python 2.6.1 on mac os x 10.6 : UnboundLocalError: local variable '_[1]' referenced before assignment here's the code that raises this: params = [ self.__formatData(paramProcFunc, query, p) for p in params ] what I don't get is that it worked on mac os x 10.5 (python 2.5.x) but it no longer works. I tried the following and it works : r = [] for p in params: r.append(self.__formatData(paramProcFunc, query, p)) params = r Does anyone understand what is going on here? Thank you, Gabriel Clearly you're not supplying enough context. The UnboundLocalError is only raised inside a function (or method), and you only show one line of that function. And in the second example, it's even worse, since you imply it's top-level code by carefully unindenting everything. My *guess* is that you have a global variable params, which you're looping on. And then you assign a local variable by the same name. If you have an assignment anywhere in the function, that name is considered a local, and if you reference it before you assign it, it'll generate this error. Three possible fixes, depending on why you're doing this. 1) pass the params in to the function as an argument 2) use a different name for the local thing you're building 3) use a global statement to force the compiler to use the global one and not create a local. (probably a bad idea) DaveA Hello Dave, ok, you' re right about not showing enough: params = [ self.__formatData(paramProcFunc, query, p) for p in params ] where : paramProcFunc = "percent2Volume" def __formatData(self, func, query, data): return getattr(self._unitDataAbs, func)(self._unitCmdAbs, query, data) def percent2Volume(self, absCmds, query, percent): return query, int(round(percent / 100.0 * absCmds["volCeil"])) but I still don't see where the problem is and why it works with the explicit loop and not the list comp. Thanks, Gabriel I don't see either; you still don't supply nearly enough context. You don't show enough code for someone to actually try it, and since it's not crashing on that line, you're clearly not showing the whole stack trace. I made a few wild guesses about your code, and have something that compiles and runs. But I'm on Windows XP, with Python 2.6.4, so your mileage may vary. import sys print sys.version class Dummy(object): def __init__(self): self._unitDataAbs = self self._unitCmdAbs = {"volCeil":298} def crash(self): query = "this is a query" params = [100,20,37,42] paramProcFunc = "percent2Volume" params = [ self.__formatData(paramProcFunc, query, p) for p in params ] return params def __formatData(self, func, query, data): return getattr(self._unitDataAbs, func)(self._unitCmdAbs, query, data) def percent2Volume(self, absCmds, query, percent): return query, int(round(percent / 100.0 * absCmds["volCeil"])) obj = Dummy() p = obj.crash() print p When I run it, I get the following output: 2.6.4 (r264:75706, Nov 3 2009, 13:23:17) [MSC v.1500 32 bit (Intel)] [('this is a query', 298), ('this is a query', 60), ('this is a query', 110), ('this is a query', 125)] You could try pasting the same code into a file on your system, and if it crashes, then copy the full error stacktrace into a message. If it doesn't, you need to either post your whole code (enough for somebody to actually test), or simplify it till it doesn't crash. Then the next-to-last change is the one that masks the problem. -- http://mail.python.org/mailman/listinfo/python-list
Re: Recommendation for small, fast, Python based web server
pyt...@bdurham.com wrote: I'm looking for a small, simple, fast, Python based web server for a simple, client side application we're building. I've used WebStack[1] for this in the past. It allows for stand-alone serving as well as plugging nicely into various "real" servers (apache+mod_python, etc) with a small tweak in how it's configured. I've looked at the web servers that come bundled with the Python standard library[1] and they are too slow. I suspect this is because they don't maintain a session between the client and server, thus every GET/POST request repeats the session setup and break down process. Or they might be based on a polling model? I'm not sure what caused the slowness you've experienced -- using Python in a CGI environment requires starting the Python interpreter each time. However if the interpreter starts just once, I've not had notable performance issues for low-volume sites (using the BaseHTTP builtin). For higher-volume sites, you might reach for Twisted which WebStack supports as well. I believe both WebStack and Twisted are redistribtable as needed. -tkc [1] http://www.boddie.org.uk/python/WebStack.html -- http://mail.python.org/mailman/listinfo/python-list
Python-URL! - weekly Python news and links (Dec 9)
QOTW: "I'm not sure you ever understood what the problem was, or where, but I'm happy you feel like you've solved it." - Marco Mariani http://groups.google.com/group/comp.lang.python/browse_thread/thread/8ec7ad4fcc714538 Python 2.7a1, the first alpha release of the 2.7 series, is available now: http://groups.google.com/group/comp.lang.python/t/743e13e80290fbbf/ A bidirectional dictionary structure analyzed: http://groups.google.com/group/comp.lang.python/t/785d100681f7d101/ How to define and use a nested class: http://groups.google.com/group/comp.lang.python/t/6649dfa6eb9797c8/ PyCon 2010 registration opens: http://pycon.blogspot.com/2009/11/registration-for-pycon-2010-is-open.html Why not have a local variable scope smaller than a function? http://groups.google.com/group/comp.lang.python/t/57a8dec0d5d5deda/ How to test whether two floating point values are "close enough" to be almost equal: http://groups.google.com/group/comp.lang.python/t/54ec18c06c46caaf/ A special notation for accessing dynamic attribute names: http://groups.google.com/group/comp.lang.python/t/2f5674a1f451b12f/ Computed attributes, properties, and the descriptor protocol "magic": http://groups.google.com/group/comp.lang.python/t/c07268689549cf01/ Name resolution, global names, importing modules, and how all of them interact: http://groups.google.com/group/comp.lang.python/t/55afecc0d9e3e6c/ http://groups.google.com/group/comp.lang.python/t/de91efba9c5d68ae/ Are there any high-volume Python-powered websites? http://groups.google.com/group/comp.lang.python/t/7e388f22cccf7c4b/ How decoupled are the Python web frameworks? http://groups.google.com/group/comp.lang.python/t/f04940f9d4b136bc/ Moving from Python 2 to Python 3: A "cheat sheet" by Mark Summerfield http://groups.google.com/group/comp.lang.python/t/53716c4136be473b/ The sheets: http://www.informit.com/promotions/promotion.aspx?promo=137519 Thoughts about bytecode optimization and measuring overhead of the eval loop: http://groups.google.com/group/comp.lang.python/t/115b24c0ee9ee06a/ Python as the starting point for a career on IT: http://groups.google.com/group/comp.lang.python/t/907419d0cdd68570/ Idea: get around the GIL using XMLRPC http://groups.google.com/group/comp.lang.python/t/9f84e7aa634de4f5/ Bored and looking for something to do in Python: http://groups.google.com/group/comp.lang.python/t/bba7c231bb9940a4/ Everything Python-related you want is probably one or two clicks away in these pages: Python.org's Python Language Website is the traditional center of Pythonia http://www.python.org Notice especially the master FAQ http://www.python.org/doc/FAQ.html PythonWare complements the digest you're reading with the marvelous daily python url http://www.pythonware.com/daily Just beginning with Python? This page is a great place to start: http://wiki.python.org/moin/BeginnersGuide/Programmers The Python Papers aims to publish "the efforts of Python enthusiasts": http://pythonpapers.org/ The Python Magazine is a technical monthly devoted to Python: http://pythonmagazine.com Readers have recommended the "Planet" site: http://planet.python.org comp.lang.python.announce announces new Python software. Be sure to scan this newsgroup weekly. http://groups.google.com/group/comp.lang.python.announce/topics Python411 indexes "podcasts ... to help people learn Python ..." Updates appear more-than-weekly: http://www.awaretek.com/python/index.html The Python Package Index catalogues packages. http://www.python.org/pypi/ Much of Python's real work takes place on Special-Interest Group mailing lists http://www.python.org/sigs/ Python Success Stories--from air-traffic control to on-line match-making--can inspire you or decision-makers to whom you're subject with a vision of what the language makes practical. http://www.pythonology.com/success The Python Software Foundation (PSF) has replaced the Python Consortium as an independent nexus of activity. It has official responsibility for Python's development and maintenance. http://www.python.org/psf/ Among the ways you can support PSF is with a donation. http://www.python.org/psf/donations/ The Summary of Python Tracker Issues is an automatically generated report summarizing new bugs, closed ones, and patch submissions. http://search.gmane.org/?author=status%40bugs.python.org&group=gmane.comp.python.devel&sort=date Although unmaintained since 2002, the Cetus collection of Python hyperlinks
Re: Perl to Python conversion
On Dec 9, 1:33 pm, martin.sch...@gmail.com (Martin Schöön) wrote: > First off: I am new here and this is my first post after > lurking for quite some time. > > Second off: I don't know much Python---yet. > > Problem: I have come across a small open source application > that I find quite useful. It does have one major flaw though. > Its output is in imperial units. Converting isn't a big deal > for occasional use but if I start to use this stuff on a > regular basis... > > So I down-loaded the source code and found this thing is written > in Perl. > > Should I learn enough Perl to add the conversion? Probably > but this may be a nice excuse to get my Python education > going and if I do I might as well re-do the user interface. > > If I do re-write this thing in Python I might need to learn both > Perl and Python... > > Hence, are there any Perl to Python converters? So far I > have only found bridgekeeper which really is (was?) consultancy. > Apart from that I only find people recommending a manual re-write. > > Any thoughts/recommendations? > > TIA, > > /Martin Martin, A full answer will depend a lot on several different factors, including the length of the Perl code, what style it was written in (there seem to be uncountably many possibilities), your experience with languages in general, and with that style in particular. In general, though, if your primary purpose is to learn Python and ending up with a useful tool is secondary, I'd recommend rewriting the tool from scratch, possibly keeping the Perl source handy. If the existing tool is command-line based, you might also be able to write a short script through which you can pipe the output of the original program to handle the conversion. Intchanter Daniel Fackrell -- http://mail.python.org/mailman/listinfo/python-list
Re: a huge shared read-only data in parallel accesses -- How? multithreading? multiprocessing?
On Dec 9, 9:58 am, Valery wrote: > Hi all, > > Q: how to organize parallel accesses to a huge common read-only Python > data structure? Use a BTree on disk in a file. A good file system will keep most of the pages you need in RAM whenever the data is "warm". This works for Python or any other programming language. Generally you can always get to any piece of data in about 4 seeks at most anyway, so if your disk is fast your app will be fast too. The file can be accessed concurrently without problems by any number of processes or threads. -- Aaron Watters http://listtree.appspot.com http://whiffdoc.appspot.com === less is more -- http://mail.python.org/mailman/listinfo/python-list
Re: Perl to Python conversion
Python and Perl often have different design idioms - learning to write *well* in a language involves understanding those idioms, and being able to translate between languages involves understanding the source language well enough to understand the intent of the program's code (even if its poorly written), and understanding the target language well enough to translate the intent into a design fitting the language. Perl and Python have enough syntactic similarities that you could, if you wanted, just translate the program verbatim. Overall, I would recommend adding your imperial->metric functionality to the Perl code for now, and on your free time work on translating to Python, so you don't feel rushed to get it finished. You will probably come to understand the Perl code better after having worked with it and been involved in a hands-on way with it. Likewise, you will become even more familiar with it and with Python as you learn how to translate the application. -- http://mail.python.org/mailman/listinfo/python-list
Re: plain text parsing to html (newbie problem)
On Dec 10, 3:59 am, João wrote: > I apologize for my newbiness but I'm banging my head making this work : > ( ... > How can I see the output run in debug mode like in perl? > One method: install ipython (another python shell, but with some useful extra features) and then run the program inside ipython in debug mode: - $ ipython In [1]: run -d filename.py Breakpoint 1 at /path/to/filename.py:3 NOTE: Enter 'c' at the ipdb> prompt to start your script. > (1)() ipdb> (You type c to continue) ipdb> c > /path/to/filename.py(3)() 2 1---> 3 import sys, os 4 import subprocess and you can see you're now on line 3. Press h for help to see what commands you can type. Press n for next line if you want to step. Press s to step into a function when it's being called. Etc. -- Anita -- http://mail.python.org/mailman/listinfo/python-list
Re: switch
MRAB wrote: Tim Chase wrote: switch row['recordtype']: case '01': phone.international += Decimal(row['internationalcost']) // optionally a "break" here depending on // C/C++/Java/PHP syntax vs. Pascal syntax which // doesn't have fall-through case '02': phone.text_messaging += ( int(row['textmessages sent']) + int(row['pages received']) + int(row['textmessages sent']) + int(row['pages received']) ... default: raise WhatTheHeckIsThis() This doesn't convert well (i.e. compactly) to a dictionary-dispatch idiom. :( Shouldn't 'case' be indented to the same level as 'switch'? And 'default' could be replaced by 'else' without ambiguity. But I want a GREEN bike-shed! :-) Yeah, "else" works nicely and makes sense. Indentation could go either way in my book, but I lean towards indented "case" because the "switch" can get easily lost if the "case"s aren't indented: switch foo: case 1: stuff() case 2: morestuff() switch bar: case 3: whatever() case 4: yet_more() else: whip_it() vs switch foo: case 1: stuff() case 2: morestuff() switch bar: case 3: whatever() case 4: yet_more() else: whip_it() Just my ponderings... -tkc -- http://mail.python.org/mailman/listinfo/python-list
Re: Sum of the factorial of the digits of a number - wierd behaviour
> numpy/scipy etc... are quite useful for Euler :) I've come to love sympy, personally. > They contain a function to do factorials (and loads more). >>> from math import factorial >>> factorial(5) 120 Geremy Condra -- http://mail.python.org/mailman/listinfo/python-list
Re: a huge shared read-only data in parallel accesses -- How? multithreading? multiprocessing?
On 12/9/2009 6:58 AM Valery said... Hi all, Q: how to organize parallel accesses to a huge common read-only Python data structure? I have such a structure which I buried in a zope process which keeps it in memory and is accessed through http requests. This was done about 8 years ago, and I think today I'd check out pyro. Emile -- http://mail.python.org/mailman/listinfo/python-list
Perl to Python conversion
First off: I am new here and this is my first post after lurking for quite some time. Second off: I don't know much Python---yet. Problem: I have come across a small open source application that I find quite useful. It does have one major flaw though. Its output is in imperial units. Converting isn't a big deal for occasional use but if I start to use this stuff on a regular basis... So I down-loaded the source code and found this thing is written in Perl. Should I learn enough Perl to add the conversion? Probably but this may be a nice excuse to get my Python education going and if I do I might as well re-do the user interface. If I do re-write this thing in Python I might need to learn both Perl and Python... Hence, are there any Perl to Python converters? So far I have only found bridgekeeper which really is (was?) consultancy. Apart from that I only find people recommending a manual re-write. Any thoughts/recommendations? TIA, /Martin -- http://mail.python.org/mailman/listinfo/python-list
Re: Sum of the factorial of the digits of a number - wierd behaviour
Even though you've worked it out -- a couple of tips: On Dec 9, 5:39 pm, SiWi wrote: > On Dec 9, 6:36 pm, SiWi wrote: > > > > > Dear python community, > > I've got a wierd problem and I hope you can help me out at it. > > I wrote the following code to find the Sum of the factorial of the > > digits of a number (this is for Project Euler 74): > > > def fac(n): > > x=1 > > for i in range(2,n+1): > > x*=i > > return x > numpy/scipy etc... are quite useful for Euler :) They contain a function to do factorials (and loads more). This to one of the readable uses of 'reduce': def fac(n): reduce(operator.mul, xrange(2, n+1), n) > > t=tuple(fac(n) for n in range(1,10)) > > > def decimals(x): > > i=1 > > d=[] > > while x>0: > > d.append(x%10) > > x=x/10 > > return d The builtin str object can take integers and return it as a string. def decimals(x): return map(int, str(x)) decimals(145) == [1, 4, 5] > > > def sumfac(x): > > return sum(t[n-1] for n in decimals(x)) > And join the two: print sum(fac(n) for n in decimals(145)) > > The problem is that i get the following results, for which I can't see > > any reason: > > sumfac(145)->145 (1!+4!+5!=1 + 24 +120 = 145) - ok > > sumfac(1454)-> 169 - ok > > sumfac(45362) -> 872 - ok > > sumfac(363600) -> 727212 - wrong, should be1454 > > > Greetings, > > SiWi. > > Oops, found it myself. You can ignote the message above. You might also find it useful to write generators (esp. for primes and factorials). Cheers, Jon. -- http://mail.python.org/mailman/listinfo/python-list
Re: switch
Tim Chase wrote: Carl Banks wrote: What if the object is a string you just read from a file? How do you dispatch using polymorphism in that case? [snip] which would nicely change into something like switch row['recordtype']: case '01': phone.international += Decimal(row['internationalcost']) // optionally a "break" here depending on // C/C++/Java/PHP syntax vs. Pascal syntax which // doesn't have fall-through case '02': phone.text_messaging += ( int(row['textmessages sent']) + int(row['pages received']) + int(row['textmessages sent']) + int(row['pages received']) ... default: raise WhatTheHeckIsThis() This doesn't convert well (i.e. compactly) to a dictionary-dispatch idiom. :( Shouldn't 'case' be indented to the same level as 'switch'? And 'default' could be replaced by 'else' without ambiguity. -- http://mail.python.org/mailman/listinfo/python-list
using freeze.py with python3
Has anyone tried using Python-3.1.1/Tools/freeze/freeze.py with the encodings package? It appears that encodings is required to intialize the interpreter, but PyImport_ImportFrozenModule is failing for the "encodings" module in marshal.c:r_object(), after trying to demarshal an object of type 0. The failing callstack looks like this: #0 0x00599114 in PyImport_ImportFrozenModule at import.c:2011 #1 0x00598b14 in load_module at import.c:1830 #2 0x0059aef2 in import_submodule at import.c:2631 #3 0x0059a2ed in load_next at import.c:2436 #4 0x00599629 in import_module_level at import.c:2153 #5 0x00599a80 in PyImport_ImportModuleLevel at import.c:2204 #6 0x00565b76 in builtin___import__ at bltinmodule.c:173 #7 0x004e6cfc in PyCFunction_Call at methodobject.c:84 #8 0x0048fbe5 in PyObject_Call at abstract.c:2160 #9 0x0048fd94 in call_function_tail at abstract.c:2192 #10 0x0048fe6e in PyObject_CallFunction at abstract.c:2216 #11 0x0059b7f6 in PyImport_Import at import.c:2811 #12 0x0059945e in PyImport_ImportModule at import.c:2064 #13 0x00599551 in PyImport_ImportModuleNoBlock at import.c:2115 #14 0x0058c99a in _PyCodecRegistry_Init at codecs.c:1042 #15 0x00589a50 in _PyCodec_Lookup at codecs.c:110 #16 0x005a7892 in get_codeset at pythonrun.c:145 #17 0x005a7ea1 in Py_InitializeEx at pythonrun.c:272 #18 0x005a7fbc in Py_Initialize at pythonrun.c:309 As you can see it is calling _PyCodecRegistry_Init from get_codeset(). Is there something I can disable here to avoid this problem altogether? I am using the following script with freeze.py to freeze the required modules: print('Hello world...') import dummy_threading import encodings import encodings.aliases import encodings.ascii import encodings.big5 import encodings.big5hkscs import encodings.charmap import encodings.cp037 import encodings.cp1006 import encodings.cp1026 import encodings.cp1140 import encodings.cp1250 import encodings.cp1251 import encodings.cp1252 import encodings.cp1253 import encodings.cp1254 import encodings.cp1255 import encodings.cp1256 import encodings.cp1257 import encodings.cp1258 import encodings.cp424 import encodings.cp437 import encodings.cp500 import encodings.cp737 import encodings.cp775 import encodings.cp850 import encodings.cp852 import encodings.cp855 import encodings.cp856 import encodings.cp857 import encodings.cp860 import encodings.cp861 import encodings.cp862 import encodings.cp863 import encodings.cp864 import encodings.cp865 import encodings.cp866 import encodings.cp869 import encodings.cp874 import encodings.cp875 import encodings.cp932 import encodings.cp949 import encodings.cp950 import encodings.euc_jis_2004 import encodings.euc_jisx0213 import encodings.euc_jp import encodings.euc_kr import encodings.gb18030 import encodings.gb2312 import encodings.gbk import encodings.hp_roman8 import encodings.hz import encodings.idna import encodings.iso2022_jp import encodings.iso2022_jp_1 import encodings.iso2022_jp_2 import encodings.iso2022_jp_2004 import encodings.iso2022_jp_3 import encodings.iso2022_jp_ext import encodings.iso2022_kr import encodings.iso8859_1 import encodings.iso8859_10 import encodings.iso8859_11 import encodings.iso8859_13 import encodings.iso8859_14 import encodings.iso8859_15 import encodings.iso8859_16 import encodings.iso8859_2 import encodings.iso8859_3 import encodings.iso8859_4 import encodings.iso8859_5 import encodings.iso8859_6 import encodings.iso8859_7 import encodings.iso8859_8 import encodings.iso8859_9 import encodings.johab import encodings.koi8_r import encodings.koi8_u import encodings.latin_1 import encodings.mac_arabic import encodings.mac_centeuro import encodings.mac_croatian import encodings.mac_cyrillic import encodings.mac_farsi import encodings.mac_greek import encodings.mac_iceland import encodings.mac_latin2 import encodings.mac_roman import encodings.mac_romanian import encodings.mac_turkish import encodings.mbcs import encodings.palmos import encodings.ptcp154 import encodings.punycode import encodings.raw_unicode_escape import encodings.shift_jis import encodings.shift_jis_2004 import encodings.shift_jisx0213 import encodings.tis_620 import encodings.undefined import encodings.unicode_escape import encodings.unicode_internal import encodings.utf_16 import encodings.utf_16_be import encodings.utf_16_le import encodings.utf_32 import encodings.utf_32_be import encodings.utf_32_le import encodings.utf_7 import encodings.utf_8 import encodings.utf_8_sig -- http://mail.python.org/mailman/listinfo/python-list
Re: switch
Carl Banks wrote: What if the object is a string you just read from a file? How do you dispatch using polymorphism in that case? This is where I most miss a switch/case statement in Python...I do lots of text-file processing (cellular provider data), so I have lots of code (for each provider's individual format) that looks like phones = {} for row in csv.DictReader(file('data.txt', 'rb')): phonenumber = row['phonenumber'] if phonenumber not in phones: phones[phonenumber] = Phone(phonenumber) phone = phones[phonenumber] rectype = rectype if rectype == '01': phone.international += Decimal(row['internationalcost']) elif rectype == '02': phone.text_messaging += ( int(row['textmessages sent']) + int(row['pages received']) + int(row['textmessages sent']) + int(row['pages received']) elif rectype == ... ... else: raise WhatTheHeckIsThis() which would nicely change into something like switch row['recordtype']: case '01': phone.international += Decimal(row['internationalcost']) // optionally a "break" here depending on // C/C++/Java/PHP syntax vs. Pascal syntax which // doesn't have fall-through case '02': phone.text_messaging += ( int(row['textmessages sent']) + int(row['pages received']) + int(row['textmessages sent']) + int(row['pages received']) ... default: raise WhatTheHeckIsThis() This doesn't convert well (i.e. compactly) to a dictionary-dispatch idiom. :( -tkc -- http://mail.python.org/mailman/listinfo/python-list
Re: Question about 'remote objects'
On 9-12-2009 13:56, Frank Millman wrote: My first thought was to look into Pyro. It seems quite nice. One concern I had was that it creates a separate thread for each object made available by the server. It doesn't. Pyro creates a thread for every active proxy connection. You can register thousands of objects on the server, as long as your client programs only access a fraction of those at the same time you will have as many threads as there are proxies in your client programs. This behavior can be tuned a little as well: - you can tell Pyro to not use threading at all (that will hurt concurrency a lot though) - you can limit the number of proxies that can be connected to the daemon at a time. Then I thought that, instead of the database server exposing each object remotely, I could create one 'proxy' object on the server through which all clients would communicate, and it in turn would communicate with each instance locally. I think that this is the better design in general: access large amounts of remote objects not individually, but as a batch. Lots of small remote calls are slow. A few larger calls are more efficient. Is there any particular benefit in using remote objects as opposed to writing a SocketServer? It saves you reinventing the wheel and dealing with all its problems again, problems that have been solved already in existing remote object libraries such as Pyro. Think about it: do you want to spend time implementing a stable, well defined communication protocol, or do you want to spend time building your actual application logic? Regards, Irmen. -- http://mail.python.org/mailman/listinfo/python-list
Re: When will Python 3 be fully deployed
On Wed, Dec 9, 2009 at 11:25, Nobody wrote: > On Wed, 09 Dec 2009 10:28:40 -0800, Rami Chowdhury wrote: > >>> But on Unix, it's a square-peg-round-hole situation. >> >> I dunno, I find it rather useful not to have to faff about with >> encoding to/from when working with non-ASCII files (with non-ASCII >> filenames) on Linux. > > For the kind of task I'm referring to, there is no encoding or decoding. > You get byte strings from argv, environ, files, etc, and pass them to > library functions. What those bytes "mean" as text (if anything) never > enters the equation. Perhaps we're referring to slightly different tasks, then. I'm thinking of scripts to move log files around, or archive documents, where some manipulation of file and folder names is necessary -- that's where I personally have been bitten by encodings and the like (especially since I was moving around between filesystems, as well). But I take your point that the more complex cases are complex regardless of Python version. -- http://mail.python.org/mailman/listinfo/python-list
Recommendation for small, fast, Python based web server
I'm looking for a small, simple, fast, Python based web server for a simple, client side application we're building. We don't want to distrubute and support a "real" web server like Apache or Tomcat or depend on the presence of local web server such as IIS. The application in question will service AJAX requests from a browser. We're not looking for a web framework like Django, Plone, etc. I've looked at the web servers that come bundled with the Python standard library[1] and they are too slow. I suspect this is because they don't maintain a session between the client and server, thus every GET/POST request repeats the session setup and break down process. Or they might be based on a polling model? Here are the other Python based web server implementations I'm aware of: - cherrypy - web.py - twisted Any recommendations appreciated (Python 2.6 preferred but open to Python 3.1 options). Thanks! Malcolm [1] http://docs.python.org/library/basehttpserver.html (base) http://docs.python.org/library/simplehttpserver.html http://docs.python.org/library/cgihttpserver.html -- http://mail.python.org/mailman/listinfo/python-list
Re: ANN: WHIFF.0.7 += GAE + jQueryUI + internationalization + testdrive = (last beta?)
On Dec 9, 1:48 pm, Terry Reedy wrote: > Aaron Watters wrote: > > Also the WHIFF documentation is now hosted on Google App > > Engine at thehttp://whiffdoc.appspot.com/domain. > > When I went there and clicked on the "scatter chart is generated by a > straightforward invocation of the standard WHIFF OpenFlashChart > middleware: ", Firefox *immediately* opened the 'Official' page of a > well-known ugly cultwww.sci-logy.orgin a new tab. Something is > very, very wrong. I really hope this was not intentional on your part. > > When I load the doc page again and click the chart box again, the chart > is reloaded from the local cache instead of your site and no tab is opened. > > tjr That was a joke in the tree view. You clicked on the "science link" in the tree hierarchy. I will fix it due to your complaint. Nothing is very very wrong :), it was just a misguided joke (the bio link also goes off to someone fisherman's biography...) Sorry about that. Thanks for the feedback. -- Aaron Watters === want a friend? get a dog. -- Truman -- http://mail.python.org/mailman/listinfo/python-list
Re: When will Python 3 be fully deployed
On Wed, 09 Dec 2009 10:28:40 -0800, Rami Chowdhury wrote: >> But on Unix, it's a square-peg-round-hole situation. > > I dunno, I find it rather useful not to have to faff about with > encoding to/from when working with non-ASCII files (with non-ASCII > filenames) on Linux. For the kind of task I'm referring to, there is no encoding or decoding. You get byte strings from argv, environ, files, etc, and pass them to library functions. What those bytes "mean" as text (if anything) never enters the equation. For cases where you *need* text (e.g. GUIs), Python 3 makes the simplest cases easier. The more complex cases (e.g. where each data source may have its own encoding, or even multiple encodings) aren't much different between Python 2 and Python 3. -- http://mail.python.org/mailman/listinfo/python-list
Re: Implementation suggestions for creating a Hierarchical circuit database
On Dec 9, 9:57 am, nick wrote: > Hi, > > I am writing a personal software that will read circuit design/ > netlist. I will be using the MCNC benchmarks that contain different > types of designs in SPICE netlist format. > > I need some pointers/papers/suggestions on creating a "hierarchical" > netlist database. The netlist database can, at times, be fully > flattened, partially flattened or fully hierarchical. I should be able > to answer queries like: are there any capacitors connected to node: > x1.x2.n1? > > My program is currently only for analyzing designs for connectivity, > types of elements (resistors/capacitors) and figuring out some simple > electrical properties. > > I am just starting, so please bear with me if I haven't thought about > corner cases. > > Regards > Nick If you start by considering just the flattened case, you will find that the underlying database is not much more than a labeled graph. Make sure the code (or specs anyway) to handle that case is rock solid before trying non-flattened versions. You don't want to be fixing those problems when you move to the non-flat situations. I used to work at a CAE (computer-aided enigineering) vendor where commercial software was developed to do this, plus simulation and layout (and other considerations). One issue was name resolution and linking signals across different levels. Another issue was using shared (nested) designs, where one page was used to specify a component and other pages used several instances of that component, but I don't know if the flattened version contained copies of the subcircuit or different references to (virtual) copies of the subcircuit. I advise implementing limited hierarchical features and debugging them thoroughly before you move on. E.g., make sure mutli-page designs work, then try multi-level, then nested, etc. If you limit your specs in the beginning, you will be able to build and test prototype versions quickly. Your eventual end-design will hinge on answers to questions like: Am I only doing lookup and simple local queries, or will I have to provide a flattened version of the design? If you only have to do local queries, then you can "build" a virtual copy of what you need in a subcircuit and then throw it away; if you need a flattened version, then several actual copies of the subcircuit need to be built and printed out. So even before you build a good spec, you should have a good set of questions whose answers will help determine the specification and direct the design. Mentor Graphics is still around; they may have someone who can give you pointers to aid in your project. Also many issues are addressed by CAD software; hopefully you will ask on those forums. Try hardware and CAD forums as well as comp.* forums Gerhard "Ask Me About System Design" Paseman, 2009.12.09 -- http://mail.python.org/mailman/listinfo/python-list
Re: attributes, properties, and accessors -- philosophy
Back to the subject of good tools. Use an IDE that's intended for python. We started using WingIDE because it had an inline debugger and came with all the nice things like autocomplete etc that things like eclipse or visual studio have. On Wed, Nov 25, 2009 at 8:46 AM, Bruno Desthuilliers wrote: > Ethan Furman a écrit : > > >> Very helpful, thank you. Hopefully my brain will be up to the descriptor >> protocol this time... the last couple times were, um, less than successful. >> :) >> > > Well, it's quite simple in fact. Most of the "magic" happens in > object.__getattribute__ and object.__setattr__. You'll find a rough > description of what happens here: > > > http://groups.google.com/group/comp.lang.python/browse_frm/thread/a136f7626b2a8b7d/70a672cf7448c68e > > > > > > -- > http://mail.python.org/mailman/listinfo/python-list > -- -Trevor D -- http://mail.python.org/mailman/listinfo/python-list
Re: Brent's variation of a factorization algorithm
Being an absolute dummy in Theory of Number for me ***c'est fantastique*** that brent() works =) PS 1. Values of magic parameters c = 11 and m = 137 almost don't matter. Usually they choose c = 2 (what about to run brent() in parallel with different values of "c" waiting for "n" is cracked?) 2. Before calling brent() "n" should be tested for its primality. If it is a prime brent(n) may freeze for good. 3. > A better place to publish this code would be the Python Cookbook: It requires a tedious registration etc. Gabriel, don't you mind to publish the code there by yourself? In the long run, it is an invention by Richard Brent (b.1946) =) I just rewrote it to Python from a pseudo-code once available in Wiki but which for some vague reason was later on removed from there. -- http://mail.python.org/mailman/listinfo/python-list
Re: switch
On Tue, 08 Dec 2009 21:02:44 -0800, Kee Nethery wrote: > I string together a bunch of elif statements to simulate a switch > > if foo == True: > blah > elif bar == True: > blah blah > elif bar == False: > blarg > elif This isn't what would normally be considered a switch (i.e. what C considers a switch). A switch tests the value of an expression against a set of constants. If you were writing the above in C, you would need to use a chain of if/else statements; you couldn't use a switch. Compiled languages' switch statements typically require constant labels as this enables various optimisations. The above construct is equivalent to Lisp's "cond", or guards in some functional languages. While switch-like constructs can be implemented with a dictionary, cond-like constructs would have to be implemented with a list, as there's no guarantee that the tests are mutually exclusive, so the order is significant. E.g. rules = [((lambda (foo, bar): return foo), (lambda: blah)), ((lambda (foo, bar): return bar), (lambda: blah blah)), ((lambda (foo, bar): return not bar), (lambda: blarg)), ...] for test, action in rules: if test(foo, bar): action() break -- http://mail.python.org/mailman/listinfo/python-list
Re: ANN: WHIFF.0.7 += GAE + jQueryUI + internationalization + testdrive = (last beta?)
Aaron Watters wrote: Also the WHIFF documentation is now hosted on Google App Engine at the http://whiffdoc.appspot.com/ domain. When I went there and clicked on the "scatter chart is generated by a straightforward invocation of the standard WHIFF OpenFlashChart middleware: ", Firefox *immediately* opened the 'Official' page of a well-known ugly cult www.sci-logy.org in a new tab. Something is very, very wrong. I really hope this was not intentional on your part. When I load the doc page again and click the chart box again, the chart is reloaded from the local cache instead of your site and no tab is opened. tjr -- http://mail.python.org/mailman/listinfo/python-list
Re: tkinter photoimage, couldn't recognize image data (PPM)
Terry Reedy wrote: DATA="""P3 3 2 255 255 0 0 0 255 0 0 0 255 255 255 0 255 255 255 0 0 0""" Should the string really have the newlines? Or should this be DATA="""P3\ 3 2\ 255\ 255 0 0 0 255 0 0 0 255\ 255 255 0 255 255 255 0 0 0""" I've tried it, still same error, I did had a look at http://netpbm.sourceforge.net/doc/ppm.html and the wikipedia page. self.tk.call(('image', 'create', imgtype, name,) + options) _tkinter.TclError: couldn't recognize image data - -- MPH http://blog.dcuktec.com 'If consumed, best digested with added seasoning to own preference.' -- http://mail.python.org/mailman/listinfo/python-list
Re: When will Python 3 be fully deployed
On Wed, Dec 9, 2009 at 09:53, Nobody wrote: > > I'm sure that the Unicode approach works great on Windows, where wchar_t > is so pervasive that Microsoft may as well have just redefined "char" > (even to the point of preferring UTF-16-LE for text files over UTF-8, > ASCII-compatibility be damned). > > But on Unix, it's a square-peg-round-hole situation. I dunno, I find it rather useful not to have to faff about with encoding to/from when working with non-ASCII files (with non-ASCII filenames) on Linux. Rami Chowdhury "Never assume malice when stupidity will suffice." -- Hanlon's Razor 408-597-7068 (US) / 07875-841-046 (UK) / 0189-245544 (BD) > > -- > http://mail.python.org/mailman/listinfo/python-list > -- http://mail.python.org/mailman/listinfo/python-list
Re: switch
hong zhang yahoo.com> writes: > > List, > > Python does not have switch statement. Any other option does similar work? > Thanks for help. > > --henry > > I see a couple of people have mentioned using a dictionary. If the value that you are switching on is a string, or could be made into one, you can use a variant of the command dispatch pattern. class MyCommandDispatcher(object): def do_a(self): # do stuff def do_b(self): # do stuff def do_5(self): # do stuff def default(self): # do stuff def switch(self, option): getattr(self, 'do_' + str(option), self.default)() d = MyCommandDispatcher() d.switch('a') d.switch(5) This isn't _much_ more coding than using the dictionary method, and is pretty readable. This is also a common pattern in python. Matt -- http://mail.python.org/mailman/listinfo/python-list
Re: When will Python 3 be fully deployed
On Sun, 06 Dec 2009 22:10:15 +, Edward A. Falk wrote: >>I recently read that many libraries, including Numpy have not been >>ported to Python 3. >> >>When do you think that Python 3 will be fully deployed? > > It will never be fully deployed. There will always be people out there who > haven't felt it necessary to upgrade their systems. Moreover, there will always be people out there who have felt it necessary not to upgrade their systems. IMNSHO, Python 2 will still be alive when Python 4 is released. If python.org doesn't want to maintain it, ActiveState will. In particular: for Unix scripting, Python 3's Unicode obsession just gets in the way. Ultimately, argv, environ, filenames, etc really are just byte strings. Converting to Unicode just means that the first thing that the script does is to convert back to bytes. I'm sure that the Unicode approach works great on Windows, where wchar_t is so pervasive that Microsoft may as well have just redefined "char" (even to the point of preferring UTF-16-LE for text files over UTF-8, ASCII-compatibility be damned). But on Unix, it's a square-peg-round-hole situation. -- http://mail.python.org/mailman/listinfo/python-list
Re: tkinter photoimage, couldn't recognize image data (PPM)
Martin P. Hellwig wrote: Hi all, I've tried to display an image with the source being a string but it fails (see below). Is there a way to display PPM without writing it first to a file? Thanks, Martin - snippet - ''' Ubuntu 9.04 64bit, python 3.1 ''' import tkinter DATA="""P3 3 2 255 255 0 0 0 255 0 0 0 255 255 255 0 255 255 255 0 0 0""" Should the string really have the newlines? Or should this be DATA="""P3\ 3 2\ 255\ 255 0 0 0 255 0 0 0 255\ 255 255 0 255 255 255 0 0 0""" def display(): tk = tkinter.Tk() canvas = tkinter.Canvas(tk, width=3, height=2) canvas._image_reference = tkinter.PhotoImage(format='ppm', data=DATA) canvas.create_image((0,0), image=canvas._image_reference) canvas.pack() tk.after(1500, tk.quit) tk.mainloop() if __name__ == '__main__': display() - - traceback - Traceback (most recent call last): File "/home/martin/DCUK Technologies/workspace/mhellwig/src/test/tkintering.py ", line 24, in display() File "/home/martin/DCUK Technologies/workspace/mhellwig/src/test/tkintering.py ", line 17, in display canvas._image_reference = tkinter.PhotoImage(format='ppm', data=DATA) File "/usr/local/lib/python3.1/tkinter/__init__.py", line 3269, in __init__ Image.__init__(self, 'photo', name, cnf, master, **kw) File "/usr/local/lib/python3.1/tkinter/__init__.py", line 3225, in __init__ self.tk.call(('image', 'create', imgtype, name,) + options) _tkinter.TclError: couldn't recognize image data - -- http://mail.python.org/mailman/listinfo/python-list
Re: How decoupled are the Python frameworks?
Interesting post. I would like to make some comments about design decisions that went into web2py: - For each app Model/View/Controllers/Language Files/Static Files/ Modules/Cron Tasks are stored in separated folders - You can code only the models (no controllers and no view) and you get a fully functional admin interface - You can develop only controllers (with or without models but no views) and you get a fully working application with workflow - There is a convention for dispatching. You can override it with routes. - There is no metadata in the framework. URLs are mapped into an app (within the web2py instance), into a controller file, and into a function (action) in that controller file. - You can have multiple apps within a web2py instance (they can be installed, uninstalled, packaged, compiled without restarting web2py) - You can have multiple model files, multiple controllers and multiple views. You can override the mapping between controllers and default views. - You can group files (models/controllers/views/static files) functionally into plugins. Plugins can be packaged separately from the app and applied to multiple apps. - Plugins expose components (i.e. reusable objects that can be embedded in a page and talk to their own controllers via ajax). - Plugin components are coded as any other web2py models/controller/ view but the form submission is automatically trapped (transparently to the user) and executed via ajax so that, if the component contains a form only the component is reloaded upon submissions of the form. - web2py supports FORM, SQLFORM, SQLFORM.factory and CRUD for automtical generation of forms (from a model or other structure). All web2py forms execute postbacks and modify themselves to report error messages. A form is comprised of widgets that contain validators. There is a default layout but it can be customized in the view by allocating widgets or individual html tags. - You can put doctests in actions and we provide a web interface for testing the app online. - It completely abstracts the database backend (we support 10 different database backends including Google App Engine) thus make the code very portable. - It authomatically writes sql for queries, for create table and alter table. -Web2py provides a Role Based Access Control mechanism with plugguble login components so that you can authenticate using multiple mechanism including Gmail and Twitter for example. Specifically about you concerns:- better scalability - easy to test => web2py is very easy to test because of the web based interface to doctests - easy to maintain => In web2py "Do not repeat yourself" trumps "explicit if better than implicit". This means code is very compact. - easy to re-use code for different applications => using plugins - easy to migrate/port => because of DAL Massimo On Dec 7, 4:38 pm, shocks wrote: > Hi > > I'm getting back into Python after a long break. I've been developing > large enterprise apps solely with Adobe Flex (ActionScript) for the > past couple years. During that time I've used a number of 'MVC' > frameworks to glue the bits together - among them Cairngorm, a > modified implementation of Cairngorm using the Presentation Model > pattern, PureMVC, Mate (an IOC container but with an MVC > implementation) and Parsley (IOC but you have to roll-you-own MVC). > During that time I've been in large teams (30 Flex + 30 Java) to small > teams (2 Flex + 1 Java). The motivation of these frameworks is the > decouple your concerns, allowing your apps to be more scalable, easier > to test, and supposedly easier to maintain. Some do the decoupling > better job than others, but there is also the question of "how > decoupled is your code from the framework"? It's all well and good > having something clever working behind the scenes wiring and routing > everything together, but I wonder where this leaves the code base if > the framework, which was selected at the beginning of the project, is > replaced with something else months or years later (i.e. the framework > just doesn't scale as expected, the community involvement dies and > it's no longer maintained properly, etc). I've seen it happen and > I've been experienced the pain of detangling massive amounts of code > which is full of framework specific imports, methods and boilerplate > code. And then there's updating the unit tests! > > My question is how good are the current crop of Python frameworks? > I've used Django twice in production and didn't like that much. The > implementation is Django specific for starters. I've picked up Pylons > and I'm trying that out. I'm not sure how well it fares? I do feel a > bit uneasy about the code generation that some of the Python > frameworks do. Pylons creates something like 20 files for a > 'helloworld'. It does do some great things out of the box, but I > wonder where that leaves your own code. After spending 3-6 months on > your Pylons webapp, how easy is it to move to somethin
Re: How do I Block Events in wxPython
On Wed, Dec 9, 2009 at 9:06 AM, Wanderer wrote: > Found another strange bug (Strange to me, anyway). int(0.8 * 10.0) = > 7. Had to change the code to int(0.8 * 10.0 + 0.0001). > > http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm Floating point math is not precise; if you need precision, use the decimal module. Alternately, you can just be sure to round() your floats to whatever precision you need to consider significant after calculations. --S -- http://mail.python.org/mailman/listinfo/python-list
Re: Sum of the factorial of the digits of a number - wierd behaviour
On Dec 9, 6:36 pm, SiWi wrote: > Dear python community, > I've got a wierd problem and I hope you can help me out at it. > I wrote the following code to find the Sum of the factorial of the > digits of a number (this is for Project Euler 74): > > def fac(n): > x=1 > for i in range(2,n+1): > x*=i > return x > > t=tuple(fac(n) for n in range(1,10)) > > def decimals(x): > i=1 > d=[] > while x>0: > d.append(x%10) > x=x/10 > return d > > def sumfac(x): > return sum(t[n-1] for n in decimals(x)) > > The problem is that i get the following results, for which I can't see > any reason: > sumfac(145)->145 (1!+4!+5!=1 + 24 +120 = 145) - ok > sumfac(1454)-> 169 - ok > sumfac(45362) -> 872 - ok > sumfac(363600) -> 727212 - wrong, should be1454 > > Greetings, > SiWi. Oops, found it myself. You can ignote the message above. -- http://mail.python.org/mailman/listinfo/python-list
Sum of the factorial of the digits of a number - wierd behaviour
Dear python community, I've got a wierd problem and I hope you can help me out at it. I wrote the following code to find the Sum of the factorial of the digits of a number (this is for Project Euler 74): def fac(n): x=1 for i in range(2,n+1): x*=i return x t=tuple(fac(n) for n in range(1,10)) def decimals(x): i=1 d=[] while x>0: d.append(x%10) x=x/10 return d def sumfac(x): return sum(t[n-1] for n in decimals(x)) The problem is that i get the following results, for which I can't see any reason: sumfac(145)->145 (1!+4!+5!=1 + 24 +120 = 145) - ok sumfac(1454)-> 169 - ok sumfac(45362) -> 872 - ok sumfac(363600) -> 727212 - wrong, should be1454 Greetings, SiWi. -- http://mail.python.org/mailman/listinfo/python-list
Re: xmlrpc idea for getting around the GIL
On Wed, Dec 2, 2009 at 7:42 AM, sturlamolden wrote: > On 2 Des, 02:47, Patrick Stinson > wrote: > >> We don't need extension modules, and all we need to do is run some >> fairly basic scripts that make callbacks and use some sip-wrapped >> types. > > Sure, you use SIP but not extension modules... > > >> - Python is not suitable for real-time work. >> >> Not true. We have been running python callback code using >> PyObject_CallObject from within our audio thread for some time without >> a problem, and it's *extremely* fast. > > It seems you are confusing "real-time" with "real-fast". The fact that > something runs fast does not make it "real-time". > > Python is not suitable for real-time applications, nor are the OSes > commonly used to run Python. > Semantics aside, my point is that it runs well enough in our environment. If the audio is smooth, it is considered "working". > > >> We >> need just a ltle push to get our code to work at low latencies, >> and the only thing that is standing in our way is that all threads >> 9usually around 20 have to block on the Gil, and this causes small >> gaps in the sound at low latencies (around 5ms, or 64 sample period). >> >> ...almost perfect. > > Python is not programmed with real-time applications in mind: You have > no guarrantees on maximum time-lag when a thread is blocked on the > GIL. We don't need theoretical guarantees, because we've tried it and it works. That's the bottom line > > "Priority requests" (i.e. pre-emptive multitasking) was removed from > Antoine's "newgil" branch, but that is the kind of mechanism you would > need. Even with priority requests, Python would not be suitable for > real-time apps, as extension modules (e.g. C++ wrapped with SIP) can > hold the GIL forever. see above. > > You will also need an OS with a real-time scheduler and a real-time C > library, such as QNX or VxWorks. > > I find thea idea of a true real-time Python very interesting, but it > would take a completely reworked interpreter. > > > > > > > -- > http://mail.python.org/mailman/listinfo/python-list > -- http://mail.python.org/mailman/listinfo/python-list
Re: subprocess kill
On Mon, 07 Dec 2009 11:04:06 +0100, Jean-Michel Pichavant wrote: > When using shell=True, your process is started in a shell, meaning the > PID of your subprocess is not self.luca.pid, self.luca.pid is the PID of > the shell. This isn't true for a simple command on Unix (meaning a program name plus arguments, and redirections, rather than e.g. a pipeline or a command using subshells, flow-control constructs, etc). For a simple command, "/bin/sh -c 'prog arg arg ...'" will exec() the program *without* fork()ing, so the program will "take over" the shell's process and PID. You can verify this by running e.g.: import subprocess p = subprocess.Popen('sleep 10', shell=True) print p.pid subprocess.call('ps') p.wait() -- http://mail.python.org/mailman/listinfo/python-list
Re: How do I Block Events in wxPython
Philip Semanchuk wrote: On Dec 9, 2009, at 10:42 AM, Wanderer wrote: I have a wxPython program which does some calculations and displays the results. During these calculations if I click the mouse inside the dialog the program locks up. If I leave the dialog alone the process completes fine. I have tried running the function from a separate dialog with Show Modal and I have tried using SetEvtHandlerEnabled all to no avail. The program is long and occupies several files so I won't show the whole thing but here is the calculation part. How do I block events? Hi Wanderer, I don't have a solution for you but I have three suggestions. First, your program shouldn't be locking up just because you clicked on it. IMO that's the real problem, and discarding events is just a band-aid to cover it up. Nevertheless, sometimes a band-aid is an appropriate solution and you're the best judge of that. Second, the wxPython mailing list would be a better place for this question. Third, if you can't seem to resolve the problem, try paring it down to a minimal example that reproduces the problem. It's difficult to offer suggestions when we can't see the whole code or try the sample code ourselves. Good luck Philip Wanderer, I agree with Philip. You probably want your calculation code in a separate thread. I'd advise against this, but if you're just looking for a bandaid you could try creating an event handler to catch the mouse clicks and simply call event.Skip(). If you do this, you might have to introduce a flag that gets set to True only during your calculation, and then your event hander could look something like this: def OnMouseClick(self, event): # Only skip mouse click event if calculating if self.busy: event.Skip() Jeff -- http://mail.python.org/mailman/listinfo/python-list
ANN: WHIFF.0.7 += GAE + jQueryUI + internationalization + testdrive = (last beta?)
ANNOUNCING WHIFF [WSGI HTTP Integrated Filesystem Frames] release 0.7 WHIFF INDEX PAGE: http://whiff.sourceforge.net The new release adds many new features, including - Google app engine support with tutorial: http://whiffdoc.appspot.com/docs/W1100_2300.GAEDeploy - jQueryUI interactive widget support with tutorial: http://whiffdoc.appspot.com/docs/W1100_1450.jQueryUI - Internationalization tutorial: http://whiffdoc.appspot.com/docs/W1100_1700.international - "no install" test drive: http://whiffdoc.appspot.com/docs/W1100_0500.TestDrive Also the WHIFF documentation is now hosted on Google App Engine at the http://whiffdoc.appspot.com/ domain. What is WHIFF? WHIFF is a collection of support services for WSGI/Python web applications which allows applications to be composed by "dropping" dynamic pages into container directories. This mode of development will be familiar to developers who have created PHP applications, vanilla CGI scripts, Apache/modpy Publisher applications, JSP pages, or static web content. The WHIFF implementation significantly generalizes the "drop in" paradigm to support WSGI middleware components and application fragments as well as stand-alone pages. WHIFF provides other services in addition to supporting "drop in" components, such as managed application resources. WHIFF requires Python 2.5 or better to run out-of-the-box. Unless significant problems appear in the next month or so I think this release will be the last beta release and the next release will add a couple more features to become WHIFF 1.0. For more fun please have a look at my community list/tree maker at http://listtree.appspot.com which is inspired by Guido van Rossum's excellent faqwiz. ListTree is implemented on Google App Engine using WHIFF. I hope you like. -- Aaron Watters === Talk low. Talk slow. And don't say a lot. -- John Wayne's advice to Clint Eastwood -- http://mail.python.org/mailman/listinfo/python-list
Re: How do I Block Events in wxPython
On Dec 9, 11:48 am, r0g wrote: > Wanderer wrote: > > I have a wxPython program which does some calculations and displays > > the results. During these calculations if I click the mouse inside the > > dialog the program locks up. If I leave the dialog alone the process > > completes fine. > > If anything in your GUI app takes a non trivial length of time to > execute you need to run it in either a thread or a separate process. > > http://linuxgazette.net/107/pai.html > > Roger Thanks Everyone. I'll have to look over these wikis about threading. I decided to go another route and user a timer to perform the loops. That way the events can be processed normally. def DoEfficiency(self, event): ang = self.tc_angle.GetValue() hgt = self.tc_height.GetValue() hgt += 0.1 if hgt > self.eclwidth: hgt = 0 ang +=1 self.tc_angle.SetValue(ang) self.height = hgt self.tc_height.SetValue(hgt) self.tc_height.SetValue(hgt) self.UpdateValues() self.Redraw() self.DrawRays() sPower = self.tc_power.GetValue() Power = sPower.split('%') self.TotalPower +=float(Power[0]) self.Counter +=1 efficiency = self.TotalPower/self.Counter self.tc_eff.SetLabel(str(round(efficiency,1))) if ang > 89: self.efftimer.Stop() self.timer.Start(10) # end DoEfficiency def OnEfficiency(self, event): self.TotalPower = 0 self.Counter = 0 self.tc_angle.SetValue(1) self.tc_height.SetValue(0) self.timer.Stop() self.efftimer.Start(100) # end MyInterface Found another strange bug (Strange to me, anyway). int(0.8 * 10.0) = 7. Had to change the code to int(0.8 * 10.0 + 0.0001). -- http://mail.python.org/mailman/listinfo/python-list
Re: plain text parsing to html (newbie problem)
João wrote: I apologize for my newbiness but I'm banging my head making this work : ( What change must I made for the tag enforcement being reflected to the 'mail' file? Am I using the WritableObject class correctly? (I'm getting a blank 'mail' file after running the .py script) How can I see the output run in debug mode like in perl? #!/usr/bin/env python import sys, os import subprocess import re import datetime # simple class with write method to redirect print output to a file class WritableObject: def __init__(self): self.content = [] def write(self, string): self.content.append(string) Python comes with a stringio class that does this *AND* has a method to retrieve the result. StringIO in 2.x, io module in 3.x -- http://mail.python.org/mailman/listinfo/python-list
Re: UnboundLocalError: local variable '_[1]' referenced before assignment
Gabriel Rossetti wrote: Gabriel Rossetti wrote: I get this error on python 2.6.1 on mac os x 10.6 : UnboundLocalError: local variable '_[1]' referenced before assignment here's the code that raises this: params = [ self.__formatData(paramProcFunc, query, p) for p in params ] what I don't get is that it worked on mac os x 10.5 (python 2.5.x) but it no longer works. In 3.0, list comps were changed to not 'leak' the iteration variables. To do this, they are compiled to a function run in a separate namespace. It appears the new code was backported to 2.6 with an extra fix to continue leaking the iteration variable for back compatibility. I presume there is or was intended to be a switch to to get 3.x behavior for code being ported. As others have said, the error is from that internal function, and should never appear. Hence, you may have found a corner-case bug that otherwise passed the current tests. Suggestions. 1) Run with 3.1 and see if you get the same error. In not, problem is in difference between 3.1 and 2.6 listcomp code. Report to tracker. 2) Simplify the code and see if you still get the error. I would try removing the '__' from the method name, or using a data attribute instead of a method, or a method with no parameters. Unless someone here otherwise pins the error on you, report on the tracker. Terry Jan Reedy I tried the following and it works : r = [] for p in params: r.append(self.__formatData(paramProcFunc, query, p)) params = r In 2.5, list comps were rewritten like this. Does anyone understand what is going on here? params = [ self.__formatData(paramProcFunc, query, p) for p in params ] where : paramProcFunc = "percent2Volume" def __formatData(self, func, query, data): return getattr(self._unitDataAbs, func)(self._unitCmdAbs, query, data) def percent2Volume(self, absCmds, query, percent): return query, int(round(percent / 100.0 * absCmds["volCeil"])) but I still don't see where the problem is and why it works with the explicit loop and not the list comp. Thanks, Gabriel -- http://mail.python.org/mailman/listinfo/python-list
Re: How do I Block Events in wxPython
Wanderer wrote: > I have a wxPython program which does some calculations and displays > the results. During these calculations if I click the mouse inside the > dialog the program locks up. If I leave the dialog alone the process > completes fine. If anything in your GUI app takes a non trivial length of time to execute you need to run it in either a thread or a separate process. http://linuxgazette.net/107/pai.html Roger -- http://mail.python.org/mailman/listinfo/python-list
Re: How do I Block Events in wxPython
The wxPython wiki actually has a page on dealing with long running tasks called from event handlers called (surprise surprise): http://wiki.wxpython.org/LongRunningTasks Hint: the second to last example on that page has the clearest example - using a worker thread object to do your DoEfficiency() function. I also don't think you want to disable so many event handlers, do you? Nothing will respond to inputs as long as that process is running (assuming you aren't running it in another thread.) -- http://mail.python.org/mailman/listinfo/python-list
Re: How do I Block Events in wxPython
On Dec 9, 2009, at 10:42 AM, Wanderer wrote: I have a wxPython program which does some calculations and displays the results. During these calculations if I click the mouse inside the dialog the program locks up. If I leave the dialog alone the process completes fine. I have tried running the function from a separate dialog with Show Modal and I have tried using SetEvtHandlerEnabled all to no avail. The program is long and occupies several files so I won't show the whole thing but here is the calculation part. How do I block events? Hi Wanderer, I don't have a solution for you but I have three suggestions. First, your program shouldn't be locking up just because you clicked on it. IMO that's the real problem, and discarding events is just a band-aid to cover it up. Nevertheless, sometimes a band-aid is an appropriate solution and you're the best judge of that. Second, the wxPython mailing list would be a better place for this question. Third, if you can't seem to resolve the problem, try paring it down to a minimal example that reproduces the problem. It's difficult to offer suggestions when we can't see the whole code or try the sample code ourselves. Good luck Philip -- http://mail.python.org/mailman/listinfo/python-list
Re: Request for py program to insert space between two characters and saved as text?
Dave Angel wrote: > > > r0g wrote: >> Dave Angel wrote: >> >>> r0g wrote: >>> Dave Angel wrote: > r0g wrote: > >> Dennis Lee Bieber wrote: >> >> >>> On Tue, 8 Dec 2009 08:26:58 +0530, 74yrs old >>> >>> declaimed the following in gmane.comp.python.general: >>> >>> For Kannada project .txt(not .doc) is used, my requirement is to have one >> >> >>> That's even worse. As far as I can tell, the code will never do what he >>> wants in Python 2.x. The Kannada text file is full of Unicode >>> characters in some encoding, and if you ignore the encoding, you'll just >>> get garbage. >>> >>> >>> >> >> Ah, fair enough. In my defence though I never saw the original post or >> this kannada.txt file as my newsserver is not so much with the >> reliability. I guess it's naive to assume an english .txt file is going >> to be in ASCII these days eh? >> >> I've yet to try python 3 yet either, this whole Unicode thing looks like >> it could be a total nightmare! :( >> >> Roger. >> >> > But it isn't an english .txt file, it's a Kannada .txt file. > Presumably you didn't realize that Kannada is a (non-English) language, > spoken in parts of India, with several hundred characters. ASCII wasn't > even an option. Anyway, no harm done, someone else referred the OP to a > Python user-group local to that region. > > DaveA > Well this looked like English to me... example: *F o r K a n n a d a p r o j e c t . t x t(n o t .d o c) i s u s e d, m y r e q u i r e m e n t i s t o h a v e o n e s p a c e b e t w e e n t w o c h a r a c t e r s i n t h e t e x t.* ...but yes you're right, I had never heard of Kannada let alone knew it was another language! Roger. -- http://mail.python.org/mailman/listinfo/python-list
Re: Question about 'remote objects'
> I am writing a multi-user business/accounting application. It is getting > rather complex and I am looking at how to, not exactly simplify it, but > find a way to manage the complexity. > > I have realised that it is logically made up of a number of services - > database service with connection to database > workflow engine for business processes > services manager to handle automated services, such as web services > client manager to service logins from client workstations > possibly others > > I have made a start by splitting some of these off into separate modules > and running them in their own threads. I wouldn't do that. Creating threads (or processes) with potentially interacting components ramps up complexity a great deal, with little if any benefit at your current stage, and only a vague possibility that scaling issues appear and can be remedied by that. Instead, use threading or multi-processing to create various instances of your application that synchronize only over the DB, using locks where it is needed. Introducing RPC of whatever kind to your design will make you lose a lot of the power and flexibility code-wise, because all of a sudden you can only pass data, not behavior around. And as J Kenneth already said, deal with performance issues when the crop up. At work, we had a design with a whole bunch of separated XMLRPC-connected services, all of them restricting their access to only certain sub-schemas of the DB. This was done so that we could run them on separate servers if we wanted, with several databases. The creators of that system had the same fears as you. Guess what? Most of the time the system spend in serializing and de-serializing XML for making RPC-calls. We had no referential integrity between schemas, and no single transactions around HTTP-requests, which didn't exactly make crap out of our data, but the occasional hickup was in there. And through the limited RCP-interface, a great deal of code consisted of passing around dicts, lists and strings - with no rich OO-interface of whatever kind. Once we got rid of these premature optimizations, the system improved in performance, and the code-base was open to a *lot* of cleaning up that is still under way, but already massively improved the design. Diez -- http://mail.python.org/mailman/listinfo/python-list
Re: plain text parsing to html (newbie problem)
João wrote: I apologize for my newbiness but I'm banging my head making this work : ( What change must I made for the tag enforcement being reflected to the 'mail' file? Am I using the WritableObject class correctly? (I'm getting a blank 'mail' file after running the .py script) How can I see the output run in debug mode like in perl? [snip] You're storing the text in the 'mail' object (an instance of WritableObject), but at no point do you use what you have stored. I can also see that you're writing to a file call "mail" via output_file, but you're not closing the file before passing it to "sendmail". -- http://mail.python.org/mailman/listinfo/python-list
How do I Block Events in wxPython
I have a wxPython program which does some calculations and displays the results. During these calculations if I click the mouse inside the dialog the program locks up. If I leave the dialog alone the process completes fine. I have tried running the function from a separate dialog with Show Modal and I have tried using SetEvtHandlerEnabled all to no avail. The program is long and occupies several files so I won't show the whole thing but here is the calculation part. How do I block events? def DoEfficiency(self): from time import sleep self.timer.Stop() TotalPower = 0 Counter = 0 for ang in range(1,89): self.tc_angle.SetValue(ang) height = int(self.eclwidth * 10) for hgt in range(0,height): self.tc_height.SetValue(float(hgt)/10.0) self.UpdateValues() self.Redraw() self.DrawRays() sPower = self.tc_power.GetValue() Power = sPower.split('%') TotalPower +=float(Power[0]) Counter +=1 sleep(0.1) efficiency = TotalPower/Counter self.tc_eff.SetLabel(str(round(efficiency,1))) self.timer.Start(10) # end DoEfficiency def OnEfficiency(self, event): self.tc_aangle.SetEvtHandlerEnabled(False) self.tc_angle.SetEvtHandlerEnabled(False) self.tc_calc_len.SetEvtHandlerEnabled(False) self.tc_cpclength.SetEvtHandlerEnabled(False) self.tc_cpcwidth.SetEvtHandlerEnabled(False) self.tc_det.SetEvtHandlerEnabled(False) self.tc_ecl.SetEvtHandlerEnabled(False) self.tc_eff.SetEvtHandlerEnabled(False) self.tc_gap1.SetEvtHandlerEnabled(False) self.tc_gap2.SetEvtHandlerEnabled(False) self.tc_height.SetEvtHandlerEnabled(False) self.tc_parab.SetEvtHandlerEnabled(False) self.tc_power.SetEvtHandlerEnabled(False) self.tc_refresh.SetEvtHandlerEnabled(False) self.tc_tlength.SetEvtHandlerEnabled(False) self.tc_twidth.SetEvtHandlerEnabled(False) self.tc_use_tir.SetEvtHandlerEnabled(False) self.SetEvtHandlerEnabled(False) dlf = CalcEfficiency(self,"CalcEfficiency",wx.DefaultPosition, (90,60)) self.tc_aangle.SetEvtHandlerEnabled(True) self.tc_angle.SetEvtHandlerEnabled(True) self.tc_calc_len.SetEvtHandlerEnabled(True) self.tc_cpclength.SetEvtHandlerEnabled(True) self.tc_cpcwidth.SetEvtHandlerEnabled(True) self.tc_det.SetEvtHandlerEnabled(True) self.tc_ecl.SetEvtHandlerEnabled(True) self.tc_eff.SetEvtHandlerEnabled(True) self.tc_gap1.SetEvtHandlerEnabled(True) self.tc_gap2.SetEvtHandlerEnabled(True) self.tc_height.SetEvtHandlerEnabled(True) self.tc_parab.SetEvtHandlerEnabled(True) self.tc_power.SetEvtHandlerEnabled(True) self.tc_refresh.SetEvtHandlerEnabled(True) self.tc_tlength.SetEvtHandlerEnabled(True) self.tc_twidth.SetEvtHandlerEnabled(True) self.tc_use_tir.SetEvtHandlerEnabled(True) self.SetEvtHandlerEnabled(True) # end MyInterface class CalcEfficiency(wx.Dialog): """ """ def __init__(self, parent, title, pos, size): self.parent = parent wx.Dialog.__init__(self,parent, -1, title, pos, size) self.runButton = wx.ToggleButton(self, ID_TOGGLE, "Start", wx.DefaultPosition, (70,30)) self.Bind(wx.EVT_TOGGLEBUTTON, self.OnToggle, id = ID_TOGGLE) self.ShowModal() self.Destroy() # end init def OnToggle(self, event): if self.runButton.GetValue(): self.runButton.SetLabel("WAIT") self.SetEvtHandlerEnabled(False) self.parent.DoEfficiency() self.SetEvtHandlerEnabled(True) else: self.Close() # end OnQuit # end CalcEfficiency if __name__ == '__main__': app = MyApp(False) app.MainLoop() # end main -- http://mail.python.org/mailman/listinfo/python-list
More stuff added to ch 2 of my programming intro
Format: PDF http://preview.tinyurl.com/ProgrammingBookP3> The new stuff, section 2.7, is about programs as simulations and handling data, focusing on modeling things. It includes some Python GUI programming. The plan is to discuss containers like lists and dictionaries in perhaps two more subsections of 2.7, but I'm not quite sure about how to approach that or exactly how much to cover, since the intent of ch 2 is to introduce mostly general concepts and enable the reader to try out (more or less) interesting things. Cheers, - Alf PS: comments welcome! -- http://mail.python.org/mailman/listinfo/python-list
tkinter photoimage, couldn't recognize image data (PPM)
Hi all, I've tried to display an image with the source being a string but it fails (see below). Is there a way to display PPM without writing it first to a file? Thanks, Martin - snippet - ''' Ubuntu 9.04 64bit, python 3.1 ''' import tkinter DATA="""P3 3 2 255 255 0 0 0 255 0 0 0 255 255 255 0 255 255 255 0 0 0""" def display(): tk = tkinter.Tk() canvas = tkinter.Canvas(tk, width=3, height=2) canvas._image_reference = tkinter.PhotoImage(format='ppm', data=DATA) canvas.create_image((0,0), image=canvas._image_reference) canvas.pack() tk.after(1500, tk.quit) tk.mainloop() if __name__ == '__main__': display() - - traceback - Traceback (most recent call last): File "/home/martin/DCUK Technologies/workspace/mhellwig/src/test/tkintering.py ", line 24, in display() File "/home/martin/DCUK Technologies/workspace/mhellwig/src/test/tkintering.py ", line 17, in display canvas._image_reference = tkinter.PhotoImage(format='ppm', data=DATA) File "/usr/local/lib/python3.1/tkinter/__init__.py", line 3269, in __init__ Image.__init__(self, 'photo', name, cnf, master, **kw) File "/usr/local/lib/python3.1/tkinter/__init__.py", line 3225, in __init__ self.tk.call(('image', 'create', imgtype, name,) + options) _tkinter.TclError: couldn't recognize image data - -- MPH http://blog.dcuktec.com 'If consumed, best digested with added seasoning to own preference.' -- http://mail.python.org/mailman/listinfo/python-list
Re: UnboundLocalError: local variable '_[1]' referenced before assignment
Richard Thomas writes: > That isn't an error that should occur, not least because _[1] isn't a > valid name. Can you post a full traceback? The name _[n] is used internally when compiling list comprehensions. The name is chosen precisely because it is not an (otherwise) valid identifier. For example, try: import dis dis.dis(lambda: [ a for a in l ]) The user should never see _[n]; if he does, it's probably due to a bug in Python. -- http://mail.python.org/mailman/listinfo/python-list
plain text parsing to html (newbie problem)
I apologize for my newbiness but I'm banging my head making this work : ( What change must I made for the tag enforcement being reflected to the 'mail' file? Am I using the WritableObject class correctly? (I'm getting a blank 'mail' file after running the .py script) How can I see the output run in debug mode like in perl? #!/usr/bin/env python import sys, os import subprocess import re import datetime # simple class with write method to redirect print output to a file class WritableObject: def __init__(self): self.content = [] def write(self, string): self.content.append(string) x=datetime.date.today() , dd = x.year, x.day mail = WritableObject() print >>mail, "To: %s" % (mail1) print >>mail, "Subject: %s day %s " % (, dd) print >>mail, "Content-Type: text/html; charset=\"us-ascii\"" subprocess.call("php $HOME/report.php > temp.txt", shell=True) body = subprocess.call("cat $HOME/.txt", shell=True) print >>mail, "" print >>mail, "" print >>mail, "" #copies common header in the Problem html to the OK one subprocess.call("cp $HOME/mail $HOME/OK.html", shell=True) input_file = open('mail', 'r+') lines = input_file.readlines() input_file.close() output_file = open("mail", "w+") for line in lines: if line.startswith(''): line = '' + line.rstrip('\n') + '' + '\n' output_file.write(line) if not body: print >>mail, ''' [No problems detected ]. All monitored metrics OK ''' else: print >>mail, ''' Table Table2 Table3 %s ''' % (body) subprocess.call("sendmail m...@my.mail < mail", shell=True) output_file.close() -- http://mail.python.org/mailman/listinfo/python-list
Re: Question about 'remote objects'
"Frank Millman" writes: > Hi all > > I am writing a multi-user business/accounting application. It is getting > rather complex and I am looking at how to, not exactly simplify it, but find > a way to manage the complexity. > > I have realised that it is logically made up of a number of services - > database service with connection to database > workflow engine for business processes > services manager to handle automated services, such as web services > client manager to service logins from client workstations > possibly others > > I have made a start by splitting some of these off into separate modules and > running them in their own threads. > > I am concerned about scalability if they are all running on the same > machine, so I am looking into how to enable these services to run on > separate servers if required. Have you finished the application already? At my job we're still serving just over 1M+ web requests (a month), processing 15k+ uploads, and searching through over 5M+ database records a day. We're still running on 3 boxes. You can get a lot out of your machines before you have to think about the complex task of scaling/distributing. > My first thought was to look into Pyro. It seems quite nice. One concern I > had was that it creates a separate thread for each object made available by > the server. My database server creates separate objects for each instance of > a row read in from the database, and with multiple users running multiple > applications, with each one opening multiple tables, this could run into > hundreds, so I was not sure if that would work. It probably will work. Pyro is a very nice framework and one that I've built a few applications on. It has a lot of flexible design patterns available. Just look in the examples included with the distribution. > > Then I read that the multiprocessing module allows processes to be spread > across multiple servers. The documentation is not as clear as Pyro's, but it > looks as if it could do what I want. I assume it would use processes rather > than threads to make multiple objects available, but I don't know if there > is a practical limit. There is a theoretical limit to all of the resources on a machine. Threads don't live outside of that limit. They just have a speedier start-up time and are able to communicate with one another in a single process. It doesn't sound like that will buy you a whole lot in your application. You can spawn as many processes as you need. > > Then I thought that, instead of the database server exposing each object > remotely, I could create one 'proxy' object on the server through which all > clients would communicate, and it in turn would communicate with each > instance locally. > > That felt more managable, but then I thought - why bother with remote > objects at all? Why not just run a SocketServer on the database server, and > design a mini-protocol to allow clients to make requests and receive > results. This is a technology I am already comfortable with, as this is how > I handle client workstation logins. If I did go this route, I could apply > the same principle to all the services. Because unless you wrote your own database or are using some arcane relic, it should already have its own configurable socket interface? > > I don't have the experience to make an informed decision at this point, so I > thought I would see if there is any consensus on the best way to go from > here. Finish building the application. Do the benchmarks. Profile. Optimize. Find the clear boundaries of each component. Build an API along those boundaries. Add a network layer in front of the boundaries. Pyro is a good choice, twisted is also good. Roll your own if you think you can do better or it would fit your projects' needs. > Is there any particular benefit in using remote objects as opposed to > writing a SocketServer? Abstraction. Pyro is just an abstraction over an RPC mechanism. Nothing special about it. Twisted has libraries to do the same thing. Writing your own socket-level code can be messy if you don't do it right. > > Any advice will be much appreciated. > > Thanks > > Frank Millman Best of luck. -- http://mail.python.org/mailman/listinfo/python-list
a huge shared read-only data in parallel accesses -- How? multithreading? multiprocessing?
Hi all, Q: how to organize parallel accesses to a huge common read-only Python data structure? Details: I have a huge data structure that takes >50% of RAM. My goal is to have many computational threads (or processes) that can have an efficient read-access to the huge and complex data structure. "Efficient" in particular means "without serialization" and "without unneeded lockings on read-only data" To what I see, there are following strategies: 1. multi-processing => a. child-processes get their own *copies* of huge data structure -- bad and not possible at all in my case; => b. child-processes often communicate with the parent process via some IPC -- bad (serialization); => c. child-processes access the huge structure via some shared memory approach -- feasible without serialization?! (copy-on-write is not working here well in CPython/Linux!!); 2. multi-threading => d. CPython is told to have problems here because of GIL -- any comments? => e. GIL-less implementations have their own issues -- any hot recommendations? I am a big fan of parallel map() approach -- either multiprocessing.Pool.map or even better pprocess.pmap. However this doesn't work straight-forward anymore, when "huge data" means >50% RAM ;-) Comments and ideas are highly welcome!! Here is the workbench example of my case: ## import time from multiprocessing import Pool def f(_): time.sleep(5) # just to emulate the time used by my computation res = sum(parent_x) # my sofisticated formula goes here return res if __name__ == '__main__': parent_x = [1./i for i in xrange(1,1000)]# my huge read- only data :o) p = Pool(7) res= list(p.map(f, xrange(10))) # switch to ps and see how fast your free memory is getting wasted... print res ## Kind regards Valery -- http://mail.python.org/mailman/listinfo/python-list
Re: UnboundLocalError: local variable '_[1]' referenced before assignment
Dave Angel wrote: Gabriel Rossetti wrote: Hello everyone, I get this error on python 2.6.1 on mac os x 10.6 : UnboundLocalError: local variable '_[1]' referenced before assignment here's the code that raises this: params = [ self.__formatData(paramProcFunc, query, p) for p in params ] what I don't get is that it worked on mac os x 10.5 (python 2.5.x) but it no longer works. I tried the following and it works : r = [] for p in params: r.append(self.__formatData(paramProcFunc, query, p)) params = r Does anyone understand what is going on here? Thank you, Gabriel Clearly you're not supplying enough context. The UnboundLocalError is only raised inside a function (or method), and you only show one line of that function. And in the second example, it's even worse, since you imply it's top-level code by carefully unindenting everything. My *guess* is that you have a global variable params, which you're looping on. And then you assign a local variable by the same name. If you have an assignment anywhere in the function, that name is considered a local, and if you reference it before you assign it, it'll generate this error. Three possible fixes, depending on why you're doing this. 1) pass the params in to the function as an argument 2) use a different name for the local thing you're building 3) use a global statement to force the compiler to use the global one and not create a local. (probably a bad idea) DaveA Hello Dave, ok, you' re right about not showing enough: params = [ self.__formatData(paramProcFunc, query, p) for p in params ] where : paramProcFunc = "percent2Volume" def __formatData(self, func, query, data): return getattr(self._unitDataAbs, func)(self._unitCmdAbs, query, data) def percent2Volume(self, absCmds, query, percent): return query, int(round(percent / 100.0 * absCmds["volCeil"])) but I still don't see where the problem is and why it works with the explicit loop and not the list comp. Thanks, Gabriel -- http://mail.python.org/mailman/listinfo/python-list