[Tutor] Mixing generator expressions with list definitions
I would like to be able to do something along the lines of: my_list = [1, 2, x for x in range(3,6), 6] However this doesn't work. Is there any way of achieving this kind of thing? I tried: my_list = [1, 2, *(x for x in range(3,6)), 6] which also doesn't work. I wrote a quick function that allows me to use the generator expression as long as it is the last argument: def listify(*args): ... return [arg for arg in args] ... my_list = listify(1,2, *(x for x in range(3,6))) but obviously this limits me to using it only at the end of a list. Any clues on this greatly appreciated. Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Mixing generator expressions with list definitions
On 4/18/07, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: I would like to be able to do something along the lines of: my_list = [1, 2, x for x in range(3,6), 6] However this doesn't work. Is there any way of achieving this kind of thing? my_list = [1, 2] + range(3,6) + [6] I thought I'd got past the point where there were stupidly simple answers to my questions ;) Oh well. Thanks yet again, Kent. or, to build it in steps, my_list = [1, 2] my_list.extent(range(3, 6)) my_list.append(6) Yeah, that's how I had ben doing it. I don't really like it for some reason, though I'm not clear why I don't like it. I think maybe because it's quite verbose so it's a bit difficult for me to read it afterwards, and makes typos more likely ;) By the way I can't think of any reason to write x for x in range(3, 6) instead of just range(3, 6). range() returns a list which can be used almost anywhere the generator expression can be. If you need an explicit iterator use iter(range(3, 6)). Sorry, I oversimplfied my example. I'm actually doing: widgets = [(organisation_widget,(),{'organisation':organisation})] widgets.extend([(event_widget,(),{'event':event}) for event in organisation.events]) widgets.append((event_form,(),{'values':values})) so that later on I can just iterate through the widgets like so: for (widget, args, kwargs) in widgets: widget.display(*args, **kwargs) Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Unicode problems
I've been having unicode problems in python on Mac OS 10.4. I googled for it and found a good page in Dive Into Python that I thought might help (http://www.diveintopython.org/xml_processing/unicode.html). I tried following the instructions and set my default encoding using a sitecustomize.py, but got the following: import sys sys.getdefaultencoding() 'utf-8' s = u'La Pe\xf1a' print s Traceback (most recent call last): File stdin, line 1, in ? UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 5: ordinal not in range(128) As I understand it, that should work. I tried using different character sets (like latin-1, etc), but none of them work. The main problem I am having is in getting python not to give an error when it encounters a sterling currency sign (£, pound sign here in UK), which I suspect might be some wider problem on the mac as when I type that character in the terminal it shows a # (but in Python it shows a £). Any help, or hints greatly appreciated. Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] how to *really* copy a list
On 28/04/06, John Fouhy [EMAIL PROTECTED] wrote: On 28/04/06, kevin parks [EMAIL PROTECTED] wrote: In most case you are fine operating on the list in place and altering the existing list. In some cases you want your code to stop molesting your poor mutables and really honestly sincerly copy the dang thing. In this case i am making a function that does odd smmetry mirroring. But i want my orginal list to remain intact def mirror(seq): odd symmetry mirroring [1, 2, 3, 4] -- [1, 2, 3, 4, 3, 2, 1] foo=seq[:-1]# copy list, excluding last element for odd symetry foo.reverse() # flip it seq.extend(foo) return seq Hi Kevin, Your problem is this line: seq.extend(foo) This is the line that mutates your original list. There are a few ways you could procede here. One way is to make a copy of the argument, like this: def mirror(seq): start = list(seq) end = seq[:-1] end.reverse() start.extend(end) return start Notice that we've not calling any methods on seq, so seq won't be changed. The first line, start = list(seq), instructs python to build a new list out of the elements of seq. You could also write start = seq[:] here --- I'm not sure which is the preferred way. A little 'gotcha' with this is that if you have nested lists, these methods don't copy the nested lists, only the outer list (which makes sense, but can be surprising the first time you encounter it). If for some reason you want to copy nested lists, look into deepcopy(), otherwise you'll be fine. Also, personally I think list(seq) is better than seq[:] because it can cope with anything put into it that it could possibly work with (even dicts and iterators). def i(): ... for n in range(3): ... yield n ... list(i()) [0, 1, 2] d = {'a':1,'b':2} list(d) ['a', 'b'] i()[:] Traceback (most recent call last): File stdin, line 1, in ? TypeError: unsubscriptable object d[:] Traceback (most recent call last): File stdin, line 1, in ? TypeError: unhashable type Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Regex across multiple lines
On 26/04/06, Liam Clarke [EMAIL PROTECTED] wrote: Hi Frank, just bear in mind that the pattern: patObj = re.compile(title.*/title, re.DOTALL) will match title This is my title /title But, it'll also match title This is my title /title pSome content here/p title Another title; not going to happen with a title tag in HTML, but more an illustration /title All of that. Got to watch .* with re.DOTALL; try using .*? instead, it makes it non-greedy. Functionality for your current use case won't change, but you won't spend ages when you have a different use case trying to figure out why half your data is matching. _ When you only want a tag like title with no nested tags, I sometimes use: title[^]*/title though for anything but the most trivial cases, it's often better to use BeautifulSoup Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Looping over lists of objects
On 24/04/06, Etrade Griffiths [EMAIL PROTECTED] wrote: Hi just feeling my way into Python with a small app that reads data from file, creates objects using that data, stores the objects in a list, loops over the list doing comparison tests to filter out various objects. Here is a code snippet: [snip] Trying to debug this using IDLE. The calls x.get_a and x.get_b always return zero so something is going wrong somewhere. I think I'm either not storing the objects correctly or retrieving them correctly but no idea why! All suggestions gratefully received!!! I added some test input to give the code below, and it works fine for me. Can you give us some test input that fails for you? Can you also show us your test() function as it may the code in there that is failing. Ed class myObj: def __init__(self,a,b): self.a=a self.b=b def get_a(self): return self.a def get_b(self): return self.b input = [1 2 3, 4 5 6] L1=[] nobj=0 for line in input: L0=line.split() a=L0[1] b=L0[2] nobj=nobj+1 an_obj=myObj(a,b) L1.append(an_obj) # Filter data for i in range(1,nobj): for x in L1:# ... loop over all objects in list print a - , x.get_a() # ... get value of a from current object print b - , x.get_b() It returns: a - 2 b - 3 a - 5 b - 6 ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tutor FAQ?
Yep, I'm volunteering. Forgive my ignorance, but I couldn't seem to figure out how to edit/add pages to http://pyfaq.infogami.com/. The tutorial wiki has the edit, but the pyfaq page doesn't. I am logged in using my reddit login. I don't think the FAQ is open to public editing yet. I'm not sure when it will be, but Fredrik might be able to give a timescale. I've made a start on adding your questions, but probably won't get to do much more until tomorrow. Ed On 21/04/06, Mike Hansen [EMAIL PROTECTED] wrote: Maybe this could be integrated with the main Python FAQ in a beginner's section? Fredrik Lundh is experimenting with a FAQ wiki here: http://pyfaq.infogami.com/ Actually I put something about this on PyFAQ just the other day. Fredrik was quite keen on the idea, but I've been busy the last couple of days and haven't got around to doing anything about it. Mike, if you're volunteering that would be perfect. If anyone here has ideas for questions that get asked a lot (like How do I write a program that prints a word backwards) then just posting them in this thread would be a good start. I assume Kent, Alan and Danny don't mind their answers being reused in the wiki, but it would probably best to get explicit permission from them (and other people) to re-use text from their answers. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor Yep, I'm volunteering. Forgive my ignorance, but I couldn't seem to figure out how to edit/add pages to http://pyfaq.infogami.com/. The tutorial wiki has the edit, but the pyfaq page doesn't. I am logged in using my reddit login. Below is what little I slapped together last night. I copied the content from the Python tutor mailman page for the first question. = Python Tutor FAQ - What is Python Tutor? This list is for folks who want to ask questions regarding how to learn computer programming with the Python language. Python (http://www.python.org) is a programming language which many feel is a good first language, because it makes it easy to express the fundamental concepts of programming such as data structures and algorithms with a syntax which many find easy to read and write. Folks interested in learning about programming with Python are encouraged to join, as are folks interested in helping others learn. While the list is called tutor, anyone, whether novice or expert, can answer questions. If individuals wish to start off-line conversations about a particular concept and become one-on-one tutor/tutee, that's fine. If either party wants to summarize what they learned for others to benefit, that's fine too. There is a searchable interface to archived Tutor messages on Activestate's web site at http://aspn.activestate.com/ASPN/Mail/Browse/Threaded/python-Tutor. To see the collection of prior postings to the list, visit the Tutor Archives at http://mail.python.org/pipermail/tutor/ Using Tutor To post a message to all the list members, send email to tutor@python.org - I need help; I'm getting an error in my program. What should I do? If you are getting an error in your Python program that you don't understand, post the error message and any relevant code. Post the exact error message. Don't paraphrase the error message. The error message has details that can help resolve the issue that caused the error. - What is the policy on homework? Although those on the Python tutor mail list are eager to help, they don't want to hand you the answers to your homework. They want to help you find the answers. If you are having difficulty with your homework, send a message to the list about the problem and what you have tried. The tutors will try to nudge you in the right direction. - Why do my replies go to the person who sent the message and not to the list? This is by design. See http://www.unicom.com/pw/reply-to-harmful.html Also see this explanation http://mail.python.org/pipermail/tutor/2005-July/039889.html = Unless anyone has any more, I think the above covers the FAQs about the tutor list. Here's some of the FAQs that I came across scanning the list: ord and chr parsing html beautifulsoup editors/ides getters and setters regex match and find maxtrix operations how do I make an exe out of a python script books what should I program? unicode/encoding Mike ___ Tutor maillist - Tutor@python.org
Re: [Tutor] Tutor FAQ?
On 20/04/06, Kent Johnson [EMAIL PROTECTED] wrote: Mike Hansen wrote: I'd like to send a big Thank You to Danny, Alan, Kent and others(whos names escape me) for being such an asset to the Python community by relentlessly answering questions on the tutor list.(Do these guys sleep? They must work in shifts.) This list is one of the most civilized and responsive lists I have ever read. When many pop onto the list and ask what may seem like some of the most obvious questions, you guys calmly answer and nudge them in the right direction without ever losing your patience. It's a great list. Thanks! I do sleep but I have my email tied in to my clock radio so whenever an email arrives on the tutor list I am awakened to answer it ;) Anyway, I've been reading the list for a couple of years now, and I wonder if a Tutor FAQ would be helpful. I don't believe one exists. Should there be something on the Python wiki that would list the most common questions to the tutor list along with their answers? It would be a FAQ about the tutor list as well as common questions to the tutor list. I wonder about this sometimes too. I think it would be good to have a place to collect this stuff. Maybe this could be integrated with the main Python FAQ in a beginner's section? Fredrik Lundh is experimenting with a FAQ wiki here: http://pyfaq.infogami.com/ Actually I put something about this on PyFAQ just the other day. Fredrik was quite keen on the idea, but I've been busy the last couple of days and haven't got around to doing anything about it. Mike, if you're volunteering that would be perfect. If anyone here has ideas for questions that get asked a lot (like How do I write a program that prints a word backwards) then just posting them in this thread would be a good start. I assume Kent, Alan and Danny don't mind their answers being reused in the wiki, but it would probably best to get explicit permission from them (and other people) to re-use text from their answers. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tutor FAQ?
On 21/04/06, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: If anyone here has ideas for questions that get asked a lot (like How do I write a program that prints a word backwards) then just posting them in this thread would be a good start. We should be careful about posting solutions to homework problems, which this could easily be. Agreed ;-) The last couple of times people have asked this, there's been some really good replies that helped them tease out the solution (what to think about, how to think about the problem, etc). I think quite a lot of the answers to some FAQs won't be solutions, but advice. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Force a value to int
Is there a particular way to force a value to be an int by either converting it with int() or returning a default value. I've ended up writing my own function to do it, but it seems like the kind of thing that would be built-in somewhere. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] failing to learn python
On 10/04/06, Payal Rathod [EMAIL PROTECTED] wrote: Hi, I am trying to learn Python seriously for almost 2 months but have not gotten far at all. Infact, it seems I have not understood even the basic concepts itself. I know some shell, sed and awk programming. I have tried reading Learning Python - Mark Lutz Think C Spy A byte of Python Non-Programmers Tutorial For Python etc. But I have not got anything from them. I am feeling that they are superficial and do not touch real life problems. Also, not enough examples are provided which can help newbies like me. Can anyone help me, it is pretty pretty frustating thing for last couple of months? With warm regards, -Payal You might find reading real code to be more useful than a tutorial: Fredrik Lundh's Guide to the Standard Library contains thousands of examples: http://effbot.org/zone/librarybook-index.htm PLEAC contains loads of examples to show how to do things: http://pleac.sourceforge.net/pleac_python/index.html It all depends what kind of learner you are: Learn by being taught (read the tutorials) Learn by doing (think of a project, start trying to do it, then ask here when you get stuck) Learn by example (read lots of examples of other people's code to see how they do it) I'm very much the kind of person who likes to learn to swim by jumping as far into the water as he can, then trying to get back to the side. It's amazing how well you can do something when you don't have any choice. ;-) Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Database Connectivity
On 11/04/06, Kaushal Shriyan [EMAIL PROTECTED] wrote: Hi ALL How do i connect my python program to MySQL DB or Oracle DB or can you please specify the URL which gives a detailed explanation on this. SQLObject is your best bet: http://www.sqlobject.org/ If you're using MySQL, you will need MySQLdb as well: http://sourceforge.net/projects/mysql-python Any questions, just ask. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Program for outputing the letter backward
On 29/03/06, Hoffmann [EMAIL PROTECTED] wrote: --- John Fouhy [EMAIL PROTECTED] wrote: On 29/03/06, Hoffmann [EMAIL PROTECTED] wrote: vehicle='car' index = vehicle[-1] #the last letter index_zero = vehicle[0] #the first letter while index = index_zero: letter=vehicle[index] print letter index -= 1 The problem is that I get no output here. Could I hear from you? I can print the letters backwards like this: vehicle = 'car' print vehicle[2] print vehicle[1] print vehicle[0] Output: r a c - This is not very useful, though, because it will only work for strings that are exactly three letters long. Can you see how to write a loop to produe this output? Hint: the len() function will tell you how long a string is. eg: if vehicle == 'car' then len(vehicle) == 3. -- John. ___ Hi John, I am still 'blind' here. Please, see below what I did, and what I got: vehicle='car' index = 0 lenght =len(vehicle) last = vehicle[lenght -1] while last = vehicle[0]: ... letter = vehicle[index] ... print letter ... last -= 1 ... c Traceback (most recent call last): File stdin, line 4, in ? TypeError: unsupported operand type(s) for -=: 'str' and 'int' As you can see, I am still a newbie... Could anyone, please, guide me on this exercise? Thanks! Hoffmann A technique I used to find useful when I was very first learning (and struggling) was to calculate the variables for each pass of the loop (basically remove all the variable names, just like doing algebra). So: vehicle='car' index = 0 lenght = len(vehicle) # therefore: lenght = 3 last = vehicle[lenght -1] # therefore: last = vehicle[2] # therefore: last = r while r = c: # first pass ... letter = vehicle[index] # therefore: ... letter = vehicle[0] # therefore: ... letter = c ... print letter ... last -= 1 # therefore: ... r -= 1 # therefore: ... r = r - 1 # therefore: ... ERROR You'll find that that can make it much clearer what is actually happening. An alternative is to use lots and lots of print statements: vehicle='car' print vehicle index = 0 print index lenght = len(vehicle) print lenght and so on... It would be really good if there was a way to have a verbose interpreter that showed you each of the steps in the process, but I don't know of any. For example: last = vehicle[lenght -1] last = vehicle[2] last = r Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Dynamically naming functions
On 26/03/06, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: How does one go about creating functions, classes, or callable objects when you don't know their name in advance? (For example you want to read their names in from a text file or database). I want to use this in a few different places. For example Faces, the Python Project Management Planner Tool Thingy, uses nested functions to put tasks within a project: def MyProject(): start = 2006-03-06 resource = Me def Task1(): start = 2006-03-13 def Task2(): effort = 1w I'd like to load these from a database (using SQLObject), but I'm not sure how I can define the name of the function from a filed in a database (or read in from a text file). Hi Ed, I was just wondering how this came out - did you find a way to generate these functions dynamically? Or change Faces? Or give up? I just temporarily delayed the problem. I'm going to have a look at trying to change the Faces code to use dictionaries as per your suggestion, but it would a big task for me (my biggest so far probably). (I have a new job that lets me do everything in Python, but sometimes they direct my efforts towards a particular task, which delays my working on interesting things). Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Opening .py files in firefox
On 20/03/06, Alan Gauld [EMAIL PROTECTED] wrote: If the browser tries to execute the script you will need to go to the file types setting in the browser and set .py to plain-text. This is what I need to do ... but, after looking at all the options (within tools-Options), I still can not find a way to do this; Neither can I! How odd. firefox-snafu: when I try to open a file in my document, firefox splits up the path, interprets the request as a series of files to open, and start to open a number of totally unrelated webpages. You probably need to mess around with quotes. Something like %1 after the exectuable name might do it %1 is DOS shorthand for the name of the file... Putting it in quotes should stop Firefox splitting the path. Thanks for your help, anyway; I'll stick to opening them with an editor for now. You've got me curious how to do this in Firefox now :-) On Windows, Go to Run then type Regedit. Go to HKEY_CLASSES_ROOT and find .py then change it's Content Type to text/plain. As far as I am aware this is the default for python files anyway, but it may have got changed on your computer. Firefox itself doesn't have a list of MimeTypes under normal circumstances. It's mimetypes.rdf is generally empty except for references to online lists of mimetypes. (It's stored in your profile btw, usually [your profile]\Application Data\Mozilla\Firefox\Profiles\) Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Passing Dictionaries to Functions
If I have a dictionary: mydict{'var1':a, 'var2':b} and I want to pass it to a function as: myfunc(var1=a, var2=b) How would I do it? Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Passing Dictionaries to Functions
Thanks again. This does bring up an issue I occaiosionally have with the documentation. Presumambly myfunc(**mydict) is a fairly trivial thing, but it is very hard to find when you don't know what you're looking for. Not sure what the solution is, but the inability to search for things when you don't know what they're called is a bit of a stumbling block sometimes. Maybe a page that very briefly summarises the 'unsearchable' with links to fuller descriptions? Ed On 15/03/06, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: If I have a dictionary: mydict{'var1':a, 'var2':b} Presumably you mean mydict = {'var1':a, 'var2':b} and I want to pass it to a function as: myfunc(var1=a, var2=b) How would I do it? myfunc(**mydict) Kent ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Converting String to Datetime
I seem to have a lot of questions today. Sorry. How can I convert a string in the format %Y-%m-%d %H:%M:%S into a datetime object? I can work out how to convert it to a time object by: import time timestring = 2005-09-01 12:30:09 time_format = %Y-%m-%d %H:%M:%S mytime = time.strptime(timestring,time_format) I can't seem to work out how to convert the time object into a datetime object... Any help appreciated. Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Converting String to Datetime
Nevermind. i seem to have found the answer in that wonderful PLEAC site (I always forget about that. It appears that the following works: import time, datetime timestring = 2005-09-01 12:30:09 time_format = %Y-%m-%d %H:%M:%S datetime.datetime.fromtimestamp(time.mktime(time.strptime(mytime, time_format))) Ed On 15/03/06, Ed Singleton [EMAIL PROTECTED] wrote: I seem to have a lot of questions today. Sorry. How can I convert a string in the format %Y-%m-%d %H:%M:%S into a datetime object? I can work out how to convert it to a time object by: import time timestring = 2005-09-01 12:30:09 time_format = %Y-%m-%d %H:%M:%S mytime = time.strptime(timestring,time_format) I can't seem to work out how to convert the time object into a datetime object... Any help appreciated. Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Dynamically naming functions
On 13/03/06, Alan Gauld [EMAIL PROTECTED] wrote: For website, I can't really see how I can not have a dynamic structure. There's no way I'm writing a function for each folder. Hmm, this may be a CherryPie concept thing but the vast majority of websites do not have dynamic structures. It really shouldn't be necessary. Why would you need to write a function per folder, simply write one function that takes the folder as an argument. I do take your point though, however you often find that it's easy to maintain something dynamic than huge amounts of more static stuff Very rarely, its easy to do backups of huge amounts of data if you know where to find it, its hard to trawl all over a changing structure looking for the things that need backing up. Particularly if, when you try to restore it, it needs to go in a different place to where you found it! Backing up is generally one of the lesser of my worries. Maintaining content is primary. Unless you are dynamically generating static pages, they are a nightmare to maintain. Particularly as it tends to be quite repetitive. A large amount of the code on any page is the same as on any other page (page structure, boilerplate, etc). I think it's a generally accepted principle that computers are better at handling thousands of files like that better than humans are. The more of the repetitive stuff that can be removed and given to a computer, the better. in the difference between hundreds of static web pages and using a cms of some kind). Yes but a CMS normally uses a static structure with dynamic content. The templates stored in one place and the content in another. The templates know where to look for the content and the content doesn't care where the templates are. I think we might be using different meanings of structure. I'm referring to the site structure, as in which page is a parent of which other page. The site structure is just another aspect of the content. A reference to the parent/child pages is just another attribute like content and title. A (good) CMS would create a dynamic structure for the user to browse, with folders and pages easily creatable and movable, and references to pages would be dynamic so that if yo0u move a page internal links to it still work. Dynamic content is 'A Good Thing', dynamic structure is usually bad. But structure is just an aspect of content. BTW On the concept of loading your entire site at startup; if you are sharing a server you will make yourself very unpopular since you will be a huge resource hog. That's why ASP, JSP and other frameworks go to a lot of trouble to manage session lengths etc - to free up any unused resources and keep server speed up. Loading the structure of the site in the form of links might be reasonable, but only load content when you absolutely must. This also helps the maintainers update the site without restarting it. I have my own dedicated server, but point taken. Though I will still need to reload the structure of the site when the maintainers change it (adding/removing pages etc). Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Using Beautiful Soup to extract tag names
I have (unfortunately) received some data in XML format. I need to use it in Python, preferably as a list of dictionaries. The data is a flat representation of a table, in the style: tablename fieldname1Some Data/fieldname1 fieldname2Some Data/fieldname ... /tablename tablename fieldname1Some Data/fieldname1 fieldname2Some Data/fieldname ... and so on (where tablename is always the same in one file). It looks like Beautiful Soup would be a good option to quickly change it into a usable format, but I need to extract the field name (there's lots and lots of fields) as well as the data, and I can't work out how to do that in Beautiful Soup. If anyone can give me some help I'd be grateful, or if they can point me in the direction of a better solution. Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Using Beautiful Soup to extract tag names
As always Kent, you're amazing. That will do perfectly. (Though the ElementTree documentation seems a bit difficult to get through. I'm sure I'll get through it eventually). Thanks Ed On 14/03/06, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: I have (unfortunately) received some data in XML format. I need to use it in Python, preferably as a list of dictionaries. The data is a flat representation of a table, in the style: tablename fieldname1Some Data/fieldname1 fieldname2Some Data/fieldname ... /tablename tablename fieldname1Some Data/fieldname1 fieldname2Some Data/fieldname ... and so on (where tablename is always the same in one file). ElementTree makes short work of this: from elementtree import ElementTree xml = ''' datatablename fieldname1Some Data1/fieldname1 fieldname2Some Data2/fieldname2 /tablename tablename fieldname3Some Data3/fieldname3 fieldname4Some Data4/fieldname4 /tablename /data''' doc = ElementTree.fromstring(xml) # use ElementTree.parse() to parse a file for table in doc.findall('tablename'): for field in table.getchildren(): print field.tag, field.text prints: fieldname1 Some Data1 fieldname2 Some Data2 fieldname3 Some Data3 fieldname4 Some Data4 If speed is an issue then look at cElementTree which has the same interface and is blazingly fast. http://effbot.org/zone/element.htm Kent ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Dynamically naming functions
On 10/03/06, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: How does one go about creating functions, classes, or callable objects when you don't know their name in advance? (For example you want to read their names in from a text file or database). I want to use this in a few different places. For example Faces, the Python Project Management Planner Tool Thingy, uses nested functions to put tasks within a project: def MyProject(): start = 2006-03-06 resource = Me def Task1(): start = 2006-03-13 def Task2(): effort = 1w I'd like to load these from a database (using SQLObject), but I'm not sure how I can define the name of the function from a filed in a database (or read in from a text file). This is truly bizarre use of nested functions. Faces must be looking at the compiled function objects to pick this out. To be honest, this didn't seem that bizarre to me. If I understand properly (which I probably don't) functions are just callable objects like any other callable object (or at least can be treated as such). Isn't this just a handy way of creating a nested object structure that's readable? I would look into the Project objects themselves and see if there is a way to create them dynamically, rather than trying to build this structure dynamically at run time. I'd also like to be able to do this in CherryPy/TurboGears so that I can create a dynamic site structure based on fields in a database. This seems more practical. I would define a class that is configured by the database can be used as a CP model object. Then you can insert the class into the CP site structure using setattr(). In general you can set an attribute of an object using setattr(): setattr(foo, 'bar', 3) is the same as foo.bar = 3 but the attribute name is specified as a string so it can be determined at runtime. This makes sense, and I think I can see how I would use it. To create a bunch of objects from some data (just name and start date): for fname, startdate in data: def foo: start = setattr(foo, __name__, fname) setattr(foo, start, startdate) Sorting out the nesting should be fairly straightforward (if the above works). Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Dynamically naming functions
On 10/03/06, Alan Gauld [EMAIL PROTECTED] wrote: How does one go about creating functions, classes, or callable objects when you don't know their name in advance? (For example you want to read their names in from a text file or database). First point, names of functions are no different to names of other things. def f(x): y = blah return y is essentialy the same as saying f = lambda x: blah... lambda defines a nameless (aka anonymous) function and then assigns that function to the variable called f. Of course Pythons lambda construct is a bit brain dead so we can achieve the same result with just assigning an existing function to a new name def f(x): y = nblah... return y g = f Now g is a new name that refers to the function called f. I have to say I assumed that if you then changed f, g would point to the new f rather than the old f, but I tried it out and it seems otherwise: def f(x): ... print x ... f(1) 1 a = f a(1) 1 def f(x): ... print x * 2 ... f(1) 2 a(1) 1 b = f b(1) 2 Which is really cool, except that the names a and b need to be decided at run time. And with nested function definitions we can write functions that return functions: def makeMultiplyAndAdd(constants): def f(x): return constant[0] * constant[1] + x return f I'd like to load these from a database (using SQLObject), but I'm not sure how I can define the name of the function from a field in a database (or read in from a text file). Same way as you would for any other kind of variable. This has been discussed many times and there is some trickery you can do using the built in dictionaries that Python uses for its namespaces. But the biggest proiblem with introducing new names at run time is: How does the existing code get to know about those names that didn't exist when the code was written? Ypou need to have the code go exploring for names, work out what kind ioopf value they hold etc... It all gets very messy and complicated and fault prone. So the normal way to do this is to use a dictionary. The dictionary is a collection of names with values asociated with them. Those values can be functions or classes or anything else. Now your code can access the new names by using standard dictionary iterators etc. All you need are some conventions around how many parameters the functions have, their types etc. I'd also like to be able to do this in CherryPy/TurboGears so that I can create a dynamic site structure based on fields in a database. Dynamic site structure shouldn't need dynamic creation of functions although the structure might need to be dynamically loaded into a data structure in the code. It might also be a parameter of the functions. Doesn't CherryPy/TurboGears require Classes and Functions for it's data structures? (Or parameters passed to them, of course). I had been thinking that I would load my whole site at startup, but I guess it would probably be better to write a function that takes the parameters and looks up the first to see if it exists as a page, then looks to see if the second is a child of the first etc. But this really feels like something CherryPy should be doing for me. But as always remember that dynamic anything usually means much harder to maintain. All of your backup/archiving tools and error reporting tools etc will need to understand your dynamic structure too. Dynamic sounds like fun but usually means grief and is only justified as a last resort IMHO! For website, I can't really see how I can not have a dynamic structure. There's no way I'm writing a function for each folder. I do take your point though, however you often find that it's easy to maintain something dynamic than huge amounts of more static stuff (as in the difference between hundreds of static web pages and using a cms of some kind). But if you must go dynamic Python is as good a language to do it in as you'll get. That's certainly been my experience so far.. Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Dynamically naming functions
On 13/03/06, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: On 10/03/06, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: I want to use this in a few different places. For example Faces, the Python Project Management Planner Tool Thingy, uses nested functions to put tasks within a project: def MyProject(): start = 2006-03-06 resource = Me def Task1(): start = 2006-03-13 def Task2(): effort = 1w I'd like to load these from a database (using SQLObject), but I'm not sure how I can define the name of the function from a filed in a database (or read in from a text file). This is truly bizarre use of nested functions. Faces must be looking at the compiled function objects to pick this out. To be honest, this didn't seem that bizarre to me. If I understand properly (which I probably don't) functions are just callable objects like any other callable object (or at least can be treated as such). Isn't this just a handy way of creating a nested object structure that's readable? Why not just use nested dicts? MyProject = dict( start = 2006-03-06, resource = Me, Task1 = dict(start = 2006-03-13), Task2 = dict(effort = 1w), ) Maybe the appearance isn't quite as nice but the intent is clear, the code to access the data is *much* simpler, and it lends itself to the kind of programmatic creation you are trying to do. Take a look at task.Task._compile() in the faces source to see the gyrations it takes to extract the data in functional form. The Zen of Python says, Explicit is better than implicit Simple is better than complex Point taken. Dict's are easier. And the appearance is fine. I've just discovered with a little playing, that you can do: def z(v): ... def f(x): ... print x * v ... return f ... c = z(3) c(1) 3 funcdict = dict(foo = z(4)) funcdict[foo](1) 4 Which was obvious enough that I thought of trying it, but surprising enough that I was really pleased when it worked. In general you can set an attribute of an object using setattr(): setattr(foo, 'bar', 3) is the same as foo.bar = 3 but the attribute name is specified as a string so it can be determined at runtime. This makes sense, and I think I can see how I would use it. To create a bunch of objects from some data (just name and start date): for fname, startdate in data: def foo: start = setattr(foo, __name__, fname) setattr(foo, start, startdate) Sorting out the nesting should be fairly straightforward (if the above works). No, it won't work. A function attribute is not the same as a local variable of the function. What you propose is essentially def foo(): pass foo.bar = 'data' but what you need is def foo(): bar = 'data' which is very different. faces looks at foo.func_code.co_names to find the names you have used, and it actually runs the function with a tracing hook to capture the values. There doesn't seem to be any other way to define a Task in faces, either. You have to actually create functions. I guess this might be a good place to use exec - just create the source code for the function defs in a string and exec it, then retrieve the function from the global namespace and pass it to faces. Then tell me why this API is better than using nested dicts. Agreed, though to be fair the author of faces has probably overcomplicated the code for handling it (which is a damn shame as it is really quite a nice project planning tool). I guess you can't blindly iterate over the methods of functions, as there are other methods there that you might not want to use (like setattr and stuff, maybe?). Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Dynamically naming functions
How does one go about creating functions, classes, or callable objects when you don't know their name in advance? (For example you want to read their names in from a text file or database). I want to use this in a few different places. For example Faces, the Python Project Management Planner Tool Thingy, uses nested functions to put tasks within a project: def MyProject(): start = 2006-03-06 resource = Me def Task1(): start = 2006-03-13 def Task2(): effort = 1w I'd like to load these from a database (using SQLObject), but I'm not sure how I can define the name of the function from a filed in a database (or read in from a text file). I'd also like to be able to do this in CherryPy/TurboGears so that I can create a dynamic site structure based on fields in a database. Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Another try at Python's selfishness
On 04/02/06, Alan Gauld [EMAIL PROTECTED] wrote: I have to say that as a newbie, it took me quite a while to get my head around that extra parameter (self). That's OK, its true of most folks, even non newbies! It is one area where Python is different to most languages who hide the self completely. It took me ages to work out that: class A: def __init__(self, foo): self.foo = foo a = A(hello) is actually a shortcut for: a = A(a, Hello) I think insisting on: a = A(a, Hello) would be very good for readability, understandability and newbie-friendliness. Only for the constructor. Once you have the object itself the method calls wouyld be much less readable: class C: def a(s):pass c = C() c = c.a(c) etc is not descriptive of the concept of passing a message to the object c, it looks rather like you are passing the object c to a function which is a member of itself, which brings to mind recursion not messages... Remember that the purpose of writing a class is to *hide* the details of its implementation from the user, thus the user never has to use self, only the builder. The only reason you are confused is because you are both builder and user of the class. As always Alan, you've managed to make something confusing seem sensible and logical. That is the best explanation of this subject I've ever heard. But consider file objects, do you ever feel the need to write: myfile = file(myfile,filename,mode) or does myfile = file(filename,mode) seem more friendly? Is that because you've nbever actually seen the constructor code for the file class(*) and so don't worry about the presence of self? If you did have to pass the object in, wouldn't you be asking why you had to pass the object into the file creation method? I now agree, and (I think) understand completely. Ed PS Are there any good tutorials on the more philosophical side of the object orientedness of Python? I've read pretty much all the major tutorials that are commonly linked to, and they often cover HOW to use classes and stuff, but I'm quite interested in WHY we use classes (and as I've discovered from you and Kent, WHEN to use classes). I've found some general OOP tutorials, but they always seem to use Java or C which I don't know and don't particularly care to know. ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Another try at Python's selfishness
On 3 Feb 2006 03:59:10 -0800, [EMAIL PROTECTED] [EMAIL PROTECTED] wrote: I still see newbie-friendliness as a MAJOR plus for Python -- it increases the chance that users of your software will become contributors. Yes, I 100% agree to that point! But the point is, the current situation is not newbie-friendly (I can tell, I am a newbie): I declare a method with 3 parameters but when I call it I only pass 2 parameters. That's confusing. If I declare a member variable, I write: self.x = ValueForX, why can't I be equally explicit for declaring member functions? I have to say that as a newbie, it took me quite a while to get my head around that extra parameter (self). It took me ages to work out that: class A: def __init__(self, foo): self.foo = foo a = A(hello) is actually a shortcut for: a = A(a, Hello) or even: a = new A(a, Hello) I think insisting on: a = A(a, Hello) would be very good for readability, understandability and newbie-friendliness. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Newbie question re. Functions
On 31/01/06, Jon Moore [EMAIL PROTECTED] wrote: Improve the function ask_number() so that the function can be called with a step value. Make the default value of step 1. The function looks like this: def ask_number(question, low, high): Ask for a number within the range response = None while response not in range(low, high): response = int(raw_input(question)) return response To be honest, this made sense to me. I assumed the author wants you to be able to do the following: ask_number(Give me an even number between 1 and 10, 1, 10, 2) The solution would be: def ask_number(question, low, high, step=1): Ask for a number within the range response = None while response not in range(low, high, step): response = int(raw_input(question)) return response But I definitely agree that he said it very, very badly. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] How can I make a python script go directory by directory and excecute on files of choice
On 11/01/06, Liam Clarke [EMAIL PROTECTED] wrote: Hi Srinivas - For walking a directory, you can use os.walk() or os.path.walk(), but I prefer the path module here - http://www.jorendorff.com/articles/python/path/. The Path module is excellent, but it's walk still doesn't take into account the depth of the current file in the folder structure. If you need that, I wrote (with Kent's help) a simple script that will take it into account (you need the Path module above for it to work). def traverse(directory, function, depth=0): import path thedir = path.path(directory) for item in thedir.files(): function(item, depth) for item in thedir.dirs(): traverse(item,function, depth+1) It can be used like: def doprint(item, depth): print item traverse(rC:\Temp, doprint) Hope it's helpful to someone. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Accessing next and previous items during iteration
On 18/12/05, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: Is it possible to access the next and previous items during an iteration? This just came up on c.l.python. Bengt Richter has a nice generator-based solution. http://groups.google.com/group/comp.lang.python/browse_thread/thread/2e4533f108fbf172/90d87c91dac844d3?hl=en#90d87c91dac844d3 That's perfect! It's a lovely piece of code as well. Obvious once you've seen it, but you wouldn't have thought of it before hand. Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] List-question
On 19/12/05, Øyvind [EMAIL PROTECTED] wrote: I have one function that finds some values. Then I want that function to find new values based on the values it found first. However, by just looping, it starts on an eternal job. As illustrated in: list = [1,2,3] list2 = list list2 [1, 2, 3] for i in list: ... print i ... list2.append(4) ... 1 2 3 4 4 4 and it will forever continue with 4's. Why would list be expanded with the values of list2? How can I copy the result from one list, and do things with the list without getting it to expand? Because they point to the same thing. Type list2 is list after your other code and see. You want list2 to be a COPY of list not a pointer to it. Do this by using list2 = list.copy() Slices create a copy, so a shortcut is: list2 = list[:] Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Modifying Source Code while Program is Running
On 25/11/05, Alan Gauld [EMAIL PROTECTED] wrote: Just had a quick look at Smalltalk, and at first glance the overview of the ideas behind it seems amazing, but the language seems quite ugly, and it seems to be very IDE led. Adherents will defend its simplicity but I confess I strugglred for a long time with SmallTalk before learning to love it :-) And yes it is IDE led although the IDE can be 'removed' when deploying applications. But much depends on the implementation, my favourite for PCs is Dolphin SmallTalk from ObjectArts. Its not a traditional SmallTalk (ala Xerox SmallTalk 80) but very much one for the '90's I'm definitely going to investigate it further, as it does seem interesting, but I remember the first time I looked into Python, I read the tutorial and was quite bemused as it didn't seem like I'd learned anything. It was all so obvious that I didn't feel there was anything to learn. As it was I was able to very quickly plunge much deeper and end up asking lots of difficult questions that in any other language you wouldn't approach for many years. This immediately seemed to me to be a case for classes. You provide a way for a user to create a new class by subclassing the page class (from their point of view probably through adding a few new fields to a form). That might be part of the problem, if you think of a class in terms of its data attributes then that is nearly always the wrong starting point. Classes express behaviour, the data is only there to support the behaviour. Thats why methods are polymorphic but not attributes. If classes express behaviour, then what expresses the structure of the data? (ie what attributes there are going to be and what values they are likely to accept). You need (the option of) a data definition in order to generalise. Using my web server example from earlier, you need to be able to say that for any type of page, whatever it's attributes, you can create a web form to search for that type of page by iterating through it's attributes and creating a relevant form field for each type. So you think of a class having an interface and users extending or modifying the behaviour, not the data. If you follow that route you might find you don't need to write self modifying code, you simply load new classes with a common interface into an existing hook structure. I definitely had the opposite in mind. The behaviours of all the classes would be the same (and would be fairly simple, a method for rendering the page with a template, a method to update the data based on a form submission). Users would basically be able to change the data structure (add and remove attributes). However it doesn't really seem that Python is suited to this. Indeed it doesn't really seem that Python is suited to a persistent environment. What makes you think that? Most persistent environments (ie long running server processs) are written in C/C++ (or maybe Java nowadays) which are far less dynamic than Python. I'm sure Python is quite possibly the least worst at this, but that doesn't make it good at it. Having a program running for a long time (months) is possible certainly, but it seems to be fighting against the language Not at all, at least no more than in languages like C which require recoding, recompiling, stopping and then restarting the server to make changes. Thats why a simple framework with loadable modules it usally preferred to self modifying code! Again, I'm sure it is better than C, but I definitely have had the feeling that this is not something the language was designed for, and that not many other people seem to be trying it. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Modifying Source Code while Program is Running
On 26/11/05, Alan Gauld [EMAIL PROTECTED] wrote: point. Classes express behaviour, the data is only there to support the behaviour. Thats why methods are polymorphic but not attributes. If classes express behaviour, then what expresses the structure of the data? Why do you care? If the program behaves as you expect it what does it matter what data it uses or how. That should be hidden from you inside the classes. Worrying about data is a feature of traditional Information Modelling/Structured Analysis style programming, OOP is all about inter-communicating objects sending messages to each other, each requesting and providing services to the others. I get this now. It goes back to what I said earlier about the I don't care how it works philosophy. Each object doesn't care how any other works. You could completely re-engineer the internals of an object and that would be fine as long as the interface is the same. As long as the methods and attributes keep returning sensible values then everything is fine. However, I'm still slightly uncomfortable with it. It smells to me a bit like the as long as it works, its fine school of thought. For my own sanity and peace of mind I like to have my data structures well defined, as at the end of the day it's the data that matters (I can rebuild functionality but data is given to me by other people and can rarely be gotten back). (ie what attributes there are going to be and what values they are likely to accept). You need to think about the objects that you pass around as part of the messages, but those obnjects are in turn accessed via messages so their structure is not important. What does matter is the relationships between the objects, and they are related by message paths not fixed data relationships. This switch in thinking is the fundamental difference between traditional and OOP design. You need (the option of) a data definition in order to generalise. No, you need the ability to modify behaviour. Most traditional programmers think in terms of modifying behaviour in terms of big if/elif trees if obj.type == sometype doSomeTypeThing() elif obj.type == another doAnotherTypeTHing etc... Whereas in OOP you simply say obj.doThing() And the right kind of doThing will happen because obj knows how to respond to that message in the appropriate way. But writing a different doThing() for each object can be a huge waste of time. You want to be able to write one doThing() that is going to work on each object (of a particular type). This requires either knowing that all your objects are going to be similar in some respect, or writing a huge if..elseif as you mentioned. Even just saying every object has a doThing() is starting to create a data structure. Using my web server example from earlier, you need to be able to say that for any type of page, whatever it's attributes, you can create a web form to search for that type of page by iterating through it's attributes and creating a relevant form field for each type. So you want, for a given page to create a Form and search. But that's behaviour of the Page, just let it create its own form and do its own searches, not your problem. Create the right kind of Page and it will do the work for you... But then I've got to create lots of different behaviours instead of one simple generalised behaviour. I definitely had the opposite in mind. The behaviours of all the classes would be the same (and would be fairly simple, a method for rendering the page with a template, a method to update the data based on a form submission). Thats fair enough and the parent Page class would do just that, but the template class would have methods that the Page called, and you can subclass or data drive the templates to return the appropriate strings to the page. (Since web pages after all are just collections of strings - or evenone big string...) Users would basically be able to change the data structure (add and remove attributes). So maybe attributes are objects too? Maybe you page needs to know how to handle attributes and you can create pages by adding attributes from a pick list, each attribute knowing how to render itself and how to respond to searches? This combined with what Kent said, is what really solved the problem for me. There are lots of ways to address this is we think of the world in terms of intercommunicating objects not static data structures with a few overeaching functions controlling it all. I've really gained a huge amount just from this one topic. Not least of which is that classes aren't necessarily a good answer to OOP problems. I'm sure Python is quite possibly the least worst at this, but that doesn't make it good at it. Which brings me back to my original question, what environment do you think is good at it? Are you aware of such an environment or merely wishing that such a thing could be invented?
Re: [Tutor] Modifying Source Code while Program is Running
On 24/11/05, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: Is it feasible to change a program's source code whilst it is running without having to restart the program? Is it feasible to get a program to change it's own source code while it is running? You can change a class while it is running. For example, if you have a web server such as CherryPy that will (hopefully) be running for months at a time and you want to be able to change classes without having to restart the server. Or if you want to allow users of the site to edit a class through the web and see the changes to the site immediately? The auto-restart feature of CherryPy might do this for you. Also if the changes to the site are to a template such as Cheetah, those usually autoreload. Can a python program change a class, change all the objects already created by that class and save the modified class definition, so that if the program were restarted it would return to exactly the same state? (assuming all objects were saved to a database or somesuch). You can have persistent objects using for example SQLObject or ZODB, Does anyone have any good links to implementations of this? I assume someone's already done it before. It sounds like maybe you come from a background in Smalltalk, or maybe you should look at Smalltalk. In Smalltalk the whole environment is dynamic and can be saved and restored easily. Just had a quick look at Smalltalk, and at first glance the overview of the ideas behind it seems amazing, but the language seems quite ugly, and it seems to be very IDE led. For Python, I think you will do better if you narrow your requirements. Python is very dynamic - classes can be changed at runtime, or reloaded if you are careful - and there are several good ways to persist state. If you can be more specific about what you really need there may be a solution for you. What I want to do seems quite simple to me in concept, but is seeming more and more as if it would be hard to implement. I want to create a small simple CMS for my website. Users will be able to add and edit basic pages. Pages can have sub-pages (no need for folders cause a folder and an index.html can be unified into one concept). Users will also be able to create new types of pages, maybe a PressReleasePage for example. PressReleases would be based on a normal page but might have extra attributes such as Author, Abstract or DateToBeReleased. This immediately seemed to me to be a case for classes. You provide a way for a user to create a new class by subclassing the page class (from their point of view probably through adding a few new fields to a form). Later if they change their mind they can edit the class by adding or removing attributes. However it doesn't really seem that Python is suited to this. Indeed it doesn't really seem that Python is suited to a persistent environment. Having a program running for a long time (months) is possible certainly, but it seems to be fighting against the language rather than working with it. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Modifying Source Code while Program is Running
On 24/11/05, Alan Gauld [EMAIL PROTECTED] wrote: There are many ways of doing this, few of them very nice IMHO. without having to restart the program? Is it feasible to get a program to change it's own source code while it is running? Yes, you can overwrite an existing module then call reload from within the program. For example, if you have a web server such as CherryPy that will (hopefully) be running for months at a time and you want to be able to change classes without having to restart the server. Yes that would be feasible., preferrably in response to an admin page where you could fill in a list of modules to be reloaded... But you neeed to be very careful not to break any of the interfaces, the Liskov Substitution Principle must be strictly observed. to allow users of the site to edit a class through the web and see the changes to the site immediately? Extremely dangerous but the same principle would apply, simply load the existing module into an editor pane then save the modified version and reload it. Can a python program change a class, Yes as above. change all the objects already created by that class Trickier and potentially involves some low level poking that should not be encouraged IMHO! :-) and save the modified class definition, so that if the program were restarted it would return to exactly the same state? (assuming all objects were saved to a database or somesuch). If the LSP is adhered to its feasible but I don't intend to try any such thing! It would be full of pitfalls and an almosyt certain recipe for reliability problems that would be impossible to find. Self modifying code sounds like a good idea but there is a very good reason why its almost never used in production software! Well, self-modifying isn't inherently necessary. What I guess I really need is persistent classes as well as persistent objects. I always tend to think of classes as templates for objects rather than factories. In my mind, object methods are just calls to the class which are evaluated every time they are called. Objects should be strict instances of classes that can't be modified except for the values of their attributes. I think I can actually achieve this to some degree by doing: Class Page(object): def print(self): printPage(self) And have all my methods call functions (passing on parameters as necessary). That way if I change a function, it will be changed for every instance of every object of that class. And couldn't I write a function that would add functions or attributes to classes and objects? def addAttribute(class, attribute, starting value): # add it to the class # iterate through all objects already created by the class # add attribute to object Am I trying to use the wrong language for this? I love Python but I seem to keep coming up against lots of practical issues with it and I really don't want to bother with practical issues. I just want to define the behaviours I want without having to bother with how the computer is actually going to handle them. I guess it's very much a I don't care how it works! attitude, which is probably a corollary to premature optimisation is the root of all evil. Ignore all issues of memory and speed and create something highly abstract that allows you to define your solution. Then work down from there and start worrying about speed and memory and practical issues later (or hopefully never). Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Modifying Source Code while Program is Running
On 25/11/05, Ismael Garrido [EMAIL PROTECTED] wrote: Ed Singleton wrote: I want to create a small simple CMS for my website. Users will be able to add and edit basic pages. Pages can have sub-pages (no need for folders cause a folder and an index.html can be unified into one concept). Users will also be able to create new types of pages, maybe a PressReleasePage for example. PressReleases would be based on a normal page but might have extra attributes such as Author, Abstract or DateToBeReleased. Store the fields in a database, make a factory class that gets those fields and generates a page accordingly. I agree with Kent, what you're trying seems way too abstract. Weirdly, I'd just realised that SQLObject does most of what I'm thinking about. It allows you to update a class and that will affect all the objects already instantiated. It has class persistence in that it will rebuild the class on startup from the columns in your table so your 'live' changes will be there after you restart the server. Though all that is only for the data in the class. Each method could just contain a call to a function (as I mentioned above) all the functions could be contained in a module, which would make it easy to update them as it appears to be easy enough to reload a module. The only thing you wouldn't really be able to do is add or remove methods, which I guess is fine for the moment. The only thing I'm not sure of is whether SQLObject can store properties (as in managed attributes) which I need to do for the 'inherit from parent' attribute that I mentioned is a previous thread: class Page(object): def __init__(self, parent): self.__header = None self.parent = parent def getheader(self): if not self._header and self.parent: return self.parent.header else: return self.__header def setheader(self, header): self.__header = header header = property(getheader, setheader) ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Modifying Source Code while Program is Running
Is it feasible to change a program's source code whilst it is running without having to restart the program? Is it feasible to get a program to change it's own source code while it is running? For example, if you have a web server such as CherryPy that will (hopefully) be running for months at a time and you want to be able to change classes without having to restart the server. Or if you want to allow users of the site to edit a class through the web and see the changes to the site immediately? Can a python program change a class, change all the objects already created by that class and save the modified class definition, so that if the program were restarted it would return to exactly the same state? (assuming all objects were saved to a database or somesuch). Does anyone have any good links to implementations of this? I assume someone's already done it before. Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Modifying Source Code while Program is Running
On 24/11/05, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: Is it feasible to change a program's source code whilst it is running without having to restart the program? Is it feasible to get a program to change it's own source code while it is running? For example, if you have a web server such as CherryPy that will (hopefully) be running for months at a time and you want to be able to change classes without having to restart the server. Or if you want to allow users of the site to edit a class through the web and see the changes to the site immediately? This is hard. IIRC CherryPy has a way to automatically restart the server when a module changes, which is not what you ask for but at least it is automatic. A couple of recent threads on comp.lang.python have talked about this: http://groups.google.com/group/comp.lang.python/browse_frm/thread/8bb4efbe726c4ab5/848860f76210be69 http://groups.google.com/group/comp.lang.python/browse_frm/thread/7b34c30c5833a9b0/4ed71bb7c5a97b57 Kent Hmmm, that's discouraging. Do you know if it's feasible to just keep changes to code in memory synchronised with changes nto the source code? So rather than reload source code, make sure that the source code reflects what is running in memory? For example if your program is running, and you make a change to a class, is it possible to create the necessary class definition and save it to a file? Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Inheriting from parent object
Thanks for this. I hadn't really considered that I would have to explicitly store parent/child relationships. Having been browsing for something else, I came across this page about Unifying types and classes: http://www.python.org/2.2.3/descrintro.html From it, it looks like I could do something like: class Page(object): def __init__(self, parent): self.__header = None self.parent = parent def getheader(self): if not self._header and self.parent: return self.parent.header else: return self.__header def setheader(self, header): self.__header = header header = property(getheader, setheader) Which I think would end up doing exactly what I want. I still don't think I'm clear on the use of self though. Can I only use it in class definitions? I think it might be that myPage = Page(parentPage) is highly deceptive. Shouldn't it really be: new Page(myPage, parentPage) or myPage = new Page(myPage, parentPage) or am I getting really, really confused? Ed On 15/11/05, [EMAIL PROTECTED] [EMAIL PROTECTED] wrote: Sorry, I didn't really explain myself clearly. Thats OK its easy to get buried in the depths and forget everyone else is coming at it cold. But the use of non standard terms confused things even more! I want to create a kind of website ... I want to have a root object, which has page objects. The page objects will have various properties like header, footer, body and an order Sounds like a job for classes. Create a Page class with the various properties. Initialise objects with their parent (ie containing) object. to inherit the attribute from their parent page (ie if it is root.chapter3.page5 then chapter3 is the parent of page5). I guess the psuedo code would be: def inherit() return this.parent.attribute Just put code like this in the init method: Class Page: def __init__(self, parent = None): self.parent = parent # and handle default too! def getHeader(self): return self.parent.header etc... Then create Chapter3 = Page() Chapter3.header = '''h1some long string here''' Chapter3.getHeader() p2 = Page(Chapter3) p2.getHeader() # returns Chapter3.header etc (I know Python doesn't really have a 'this' But it does have self and you can use this if you prefer! knowing who the function was called by). Thats not really needed if you use objects. Although self does point at the specific Page whose method is being invoked. HTH, Alan G ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Newb ?
These both work (though neither is very graceful). text = hello message = for i in range(len(text)): message = message + text[(len(text)-i-1)] print message lst = list(text) newstr = for item in text: newstr += (lst.pop()) print newstr On 16/11/05, Chad Everett [EMAIL PROTECTED] wrote: Hello all, Have a problem here with a challenge from a book I am reading. Any help is much appreciated. I am trying to run a program that asks the user for a statement and then prints it out backwards. this is what I have. It does not print anything out. I assume that I have something out of whack with my high and low statements. Thanks for you help. print \n\nWelcome to the Backwards Message Display. print message = raw_input(\nPlease Enter a Message.) high = len(message) low = -len(message) print print message[high:low] print print raw_input(Please Press Enter to Exit) -- http://mail.python.org/mailman/listinfo/python-list ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Inheriting from parent object
I want to create a property that will inherit it's value from the same property in it's parent object, but will check it's parent's propety everytime it is called. But that can be over-ridden, and I don't have to know what the objects parent is. For example: object.x = 3 object.subobject.x = inherit() print object.subobject.x #prints 3 object.x = 4 print object.subobject.x #prints 4 object.subobject.x = 5 print object.subobject.x #prints 5 What could I put in the inherit() function that would look for the same property of it's parent and return that, whilst keeping it as general as possible? Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Rename files with numbers
Sorry, wrong list. Many apologies. Ed On 01/11/05, Ed Singleton [EMAIL PROTECTED] wrote: The best free app I've found for this is MusicBrainz [www.musicbrainz.com]. This has a huge database of obsessively correct details of albums which can be formatted in anyway you choose. It can automatically recognise which song an MP3 is! This is a similar script I wrote to renumber files in sequential order. It assumes that everything before the first underscore can be replaced. from path import path import re def renumberfiles(filesdir, startnum=1): d = path(filesdir) print d x = startnum for f in d.files(): fname = f.name.split('_', 1) fname = str(x).zfill(2) + _ + fname[-1] fname = re.sub(r ,r_,fname) fname = re.sub(r__,r_,fname) x = x + 1 print f.name, ==, f.rename(f.parent + \\ + fname) print fname As you can see, I use the path module rather than os.path. it's a much more intuitive way of handling files. http://www.jorendorff.com/articles/python/path/ Ed On 01/11/05, Dave Benjamin [EMAIL PROTECTED] wrote: On Mon, 31 Oct 2005, Micah Elliott wrote: On Oct 31, Micah Elliott wrote: Now I need to go beautify my collection. :-) While a fun exercise, there are probably already dozens (or thousands?) of utilities in existence that do this and much more. Seconded. I initially considered writing a script to rename a huge pile of MP3 files, but halfway through, I thought, there's *got* to be a better way. I found this app: http://www.softpointer.com/tr.htm Bought it the next day. Holy crap, what a gigantic timesaver. It looks up albums based on track lengths, downloads titles from freedb and Amazon, does ID3 tagging, renaming, moves files into separate directories... I busted through about 20 gigs of MP3s in three days. I kid you not. If this is just a fun toy Python project, don't let me discourage you, but if you have more than a handful of albums to rename, trust me. This problem has been solved. Here's a list of apps, including TagRename, that can query freedb: http://www.freedb.org/freedb_aware_apps.php -- .:[ dave benjamin: ramen/[sp00] ]:. \\ who will clean out my Inbox after I'm dead[?] - charles petzold -- http://mail.python.org/mailman/listinfo/python-list ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Rename files with numbers
The best free app I've found for this is MusicBrainz [www.musicbrainz.com]. This has a huge database of obsessively correct details of albums which can be formatted in anyway you choose. It can automatically recognise which song an MP3 is! This is a similar script I wrote to renumber files in sequential order. It assumes that everything before the first underscore can be replaced. from path import path import re def renumberfiles(filesdir, startnum=1): d = path(filesdir) print d x = startnum for f in d.files(): fname = f.name.split('_', 1) fname = str(x).zfill(2) + _ + fname[-1] fname = re.sub(r ,r_,fname) fname = re.sub(r__,r_,fname) x = x + 1 print f.name, ==, f.rename(f.parent + \\ + fname) print fname As you can see, I use the path module rather than os.path. it's a much more intuitive way of handling files. http://www.jorendorff.com/articles/python/path/ Ed On 01/11/05, Dave Benjamin [EMAIL PROTECTED] wrote: On Mon, 31 Oct 2005, Micah Elliott wrote: On Oct 31, Micah Elliott wrote: Now I need to go beautify my collection. :-) While a fun exercise, there are probably already dozens (or thousands?) of utilities in existence that do this and much more. Seconded. I initially considered writing a script to rename a huge pile of MP3 files, but halfway through, I thought, there's *got* to be a better way. I found this app: http://www.softpointer.com/tr.htm Bought it the next day. Holy crap, what a gigantic timesaver. It looks up albums based on track lengths, downloads titles from freedb and Amazon, does ID3 tagging, renaming, moves files into separate directories... I busted through about 20 gigs of MP3s in three days. I kid you not. If this is just a fun toy Python project, don't let me discourage you, but if you have more than a handful of albums to rename, trust me. This problem has been solved. Here's a list of apps, including TagRename, that can query freedb: http://www.freedb.org/freedb_aware_apps.php -- .:[ dave benjamin: ramen/[sp00] ]:. \\ who will clean out my Inbox after I'm dead[?] - charles petzold -- http://mail.python.org/mailman/listinfo/python-list ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] OT - Re: Can anyone help me?
You can actually increase your chance of winning in the English lottery. If two many tickets win a prize in one draw, the lowest prize (£10 for three numbers) is not paid out. Also the jackpot is shared between all the winning tickets (6 numbers) some sets of numbers like 1,2,3,4,5,6 are chosen by over 20,000 people a week. You would share the jackpot with 20,000 other people. Picking random numbers makes you less likely to chose the same numbers as everyone else. Incidently, the odds of winning the jackpot are 1 in 14 million (roughly). I've seen the jackpot go up to £25million which makes it theoretically a good bet. Ed On 28/10/05, bob [EMAIL PROTECTED] wrote: At 07:07 PM 10/27/2005, Nathan Pinno wrote: Hey all, I am trying to create a program that draws 6 numbers between 1 and 49 at random for creating lottery tickets. I want to have a better chance when I play. Define better chance. Lottery odds are how many tickets you buy relative to how many tickets everyone else has bought. No program will improve or degrade your odds. The only way you can reduce your odds is to buy more than one ticket with the same numbers. Keep in mind that a lottery is as truly random as one can get (assuming no rigging). There is no memory of past outcomes involved nor of better guessing techniques. ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Question about an re
OR tests for the truth of the first thing then the truth of the second. The first part of your OR is always true, so it doesn't test the second. What you really want to do is look for a digit and then look for more digits or a slash and some more digits. So: : \d(\d+|/\d+) but this is easier by just allowing an optional slash in the digits: : \d+/?\d* ie 1 or more digits followed by 0 or 1 slashes followed by 0 or more digits. http://www.regular-expressions.info/ is a brilliant tutorial on regexs and http://www.weitz.de/regex-coach/ is a great program for testing them out before you put them in your code. Hope this helps Ed On 27/10/05, -Terry- [EMAIL PROTECTED] wrote: -BEGIN PGP SIGNED MESSAGE- Hash: SHA1 os - Slackware py - 2.4.1 I'm trying to grab the value 10 in Visibility: 10 mile(s):0 but sometimes the value looks like Visibility: 1/2 mile(s):0 My not working regex looks like re.compile(': \d+|: \d/\d') If I'm understanding right, this should match either or, but it doesn't work for the fractional reading. Can someone steer me in the right direction and explain what I'm doing wrong? Thanks much, - -- Terry ,-~~-.___. Terry Randall tvbareATsocketDOTnet / | ' \ )0Linux Counter Project User# 98233 \_/, ,-' // / \-'~;/~~~(0) / __/~| / | If only Snoopy had Slackware... =( __| (| He is your friend, your partner, your defender, your dog. You are his life, his love, his leader. He will be yours, faithful and true, to the last beat of his heart. You owe it to him to be worthy of such devotion.-- Unknown (Best viewed with a mono-spaced font.) -BEGIN PGP SIGNATURE- Version: GnuPG v1.2.7 (GNU/Linux) iD8DBQFDYFhdQvSnsfFzkV0RAoPyAJ4jfwjWJ1eoqDatB6Hmg07XbUMGLQCeP/eQ ognaRmmfxNlDW249jRqYE2g= =Txx/ -END PGP SIGNATURE- ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Passing Functions or Code as Parameters
How can I pass a block of code to a function for it to perform within itself? For example, I wrote a small function that recurses through a directory structure but keeps a track of the depth: from path import path def traverse(directory, depth=0): thedir = path(directory) for item in thedir.files(): ## Do stuff relative to the depth for item in thedir.dirs(): traverse(item,depth+1) What I want to do is something like: from path import path def traverse(directory, depth=0, things_to_do()): thedir = path(directory) for item in thedir.files(): things_to_do(depth) for item in thedir.dirs(): traverse(item,depth+1) Is this possible? Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Fwd: Saving command line keyed input?
A quick tip for the Windows command line. Ctrl-C, Ctrl-A etc don't work, neither does right-clicking (menu-click). However, right-clicking does work on the blue title bar. Right-click on the blue title bar and then go down to Edit and then you can Select All. Then right-click on the blue title bar again and go down to Edit and then Copy. If at any point you right click in the black part of the window or do a Ctrl key sequence, it deselects all your text. Very unintuitive, as it is completely different to every other Windows app. (I think they do it on purpose to stop people wanting to use the Command Line). Ed On 19/10/05, CPIM Ronin [EMAIL PROTECTED] wrote: I know that one should use IDLE or a choosen editor for any substantial Python coding! However, if one happens to have written some interesting doodlings on the regular command line interface (under Windows XP in my case), is there an easy way to save ALL input to date into a selected file? For example: class work_center: def __init__(self,x_name): self.name = x_name x = work_center(machine press) --- What do I do to save the above work into a file named mywork.py Thanks. RC _ On the road to retirement? Check out MSN Life Events for advice on how to get there! http://lifeevents.msn.com/category.aspx?cid=Retirement ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] htmllib
You're like some kind of god! That's exactly what I need. Thanks Ed On 05/10/05, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: I want to dump a html file into a python object. Each nested tag would be a sub-object, attributes would be properties. So that I can use Python in a similar way to the way I use JavaScript within a web page. I don't know of a way to run Python from within a web page. But if you want to fetch an HTML page from a server and work with it (for example a web-scraping app), many people use BeautifulSoup for this. If you have well-formed HTML or XHTML you can use an XML parser as well but BS has the advantage of coping with badly-formed HTML. http://www.crummy.com/software/BeautifulSoup/ Kent ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] find data in html file
On 27/09/05, lmac [EMAIL PROTECTED] wrote: Hi there, i have a base-question. If i want to read some kind of data out of a line which i know the start-tag and the end-tag in an html-file how do i recognize if it's more than one line ? Example: tdSome texta hreflink/atext . DATA /tr/td etc. I would use text as the starting tag to localize the beginning of the DATA. And then /tr as the ending tag of the DATA. But if there is \n then there are more than one line. Hopefully it's just a typo or something, but you appear to have your ending /tr and /td tags the wrong way round. You should be closing the cell before you close the row. How do you want to get the data out? This case is simple enough that you could do a lazy (non-greedy) regex statement for it. Something like td([\s|\S]+?)/td would do it. Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Remaking Vim in Python (was Python Editors)
I'd like a little advice on whether I'm being really stupid here. Having researched editors and stuff, I've not quite found what I'm looking for, though Vim comes close (except that it's extremely difficult to work out what to do with it). My instinct was to try and write a small program similar to vim, but in Python. The very basics should be quite easy. If I start a system that is very easily expandable then as and when I need further functionality I can add it in. html colourisation and auto-completion should be easy enough to add using a html parser, but what about python? Is there a python module that can parse python code and is reasonably easy to use? Also, css? I know it would be ambitious to try and do this, but is it stupidly ambitious? Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Python Editors (particualrly Vim)
Okay, I've also found this: http://cream.sourceforge.net/features.html Which is amazing! It's an easy-to-use mod for Vim. It's modeless and lots of other doubtless heretical things, but it includes an outstanding auto-complete mode for text files! Ctrl-Space auto completes the word you're typing based on what you've already written in the file. I've also been trying SPE and that looks to be the most pleasing editor so far. It's also written in Python (AFAICT) which will probably have benefits in the future. Ed On 21/09/05, Ed Singleton [EMAIL PROTECTED] wrote: I don't believe there's any kinds of wars on this mailing group. :) I found this Python Vim code completion thing in my searches today: http://freshmeat.net/projects/pydiction/ Don't know how good it is, but it looks like it'd do the job. Ed On 21/09/05, Gabriel Farrell [EMAIL PROTECTED] wrote: Uh oh, looks like you're begging for an editor war. That said, I'm in the vim camp. It can do everything you specified for all of the languages you mention (well, I'm not sure about collapsible code...web search...aha![1]). After using it for four years, I'm still learning new tricks (see, for example, this page I found today on indentation[2]). vim's extendable with python scripts, but a lot of what you need for coding is already built in. I find most of my info either in the help manual that comes with it (:h) or at vim.org. gsf [1] http://www.dgp.toronto.edu/~mjmcguff/learn/vim/folding.txt [2] http://www.vim.org/tips/tip.php?tip_id=83 On Wed, Sep 21, 2005 at 02:00:20PM +0100, Ed Singleton wrote: I've been trying to decide which editor to use to edit Python (on Windows mostly). My wishlist of features would be: - automatic code formatting (indentation etc) - collapsible code (to collapse def's etc) - automatic code coloring (that's easily changeable) - auto-completion of namespaces - easy to run scripts from the editor (a shortcut key to run them or something) As I also do a lot of html, css and javascript it would be cool to have an editor that could also handle them, in which case I would want the same features for those languages, as well as the ability to write macros, scripts, etc in python. Having looked at loads of editors, I've ended up looking at emacs and vim. Emacs seems too difficult with not enough support for using the mouse. Vim seemed better, and I get the impression that it is possible to use python to script the editor, but I can't find much information on using vim as a python editor on windows. My various questions are: What other features should I be looking for? What would be the best editor for a beginner to start using, with a view to the long term? Where can I find some authoritative information about setting emacs or vim up as a fully featured python editor? Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Python Editors (particualrly Vim)
I've been trying to decide which editor to use to edit Python (on Windows mostly). My wishlist of features would be: - automatic code formatting (indentation etc) - collapsible code (to collapse def's etc) - automatic code coloring (that's easily changeable) - auto-completion of namespaces - easy to run scripts from the editor (a shortcut key to run them or something) As I also do a lot of html, css and javascript it would be cool to have an editor that could also handle them, in which case I would want the same features for those languages, as well as the ability to write macros, scripts, etc in python. Having looked at loads of editors, I've ended up looking at emacs and vim. Emacs seems too difficult with not enough support for using the mouse. Vim seemed better, and I get the impression that it is possible to use python to script the editor, but I can't find much information on using vim as a python editor on windows. My various questions are: What other features should I be looking for? What would be the best editor for a beginner to start using, with a view to the long term? Where can I find some authoritative information about setting emacs or vim up as a fully featured python editor? Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Python Editors (particualrly Vim)
I don't believe there's any kinds of wars on this mailing group. :) I found this Python Vim code completion thing in my searches today: http://freshmeat.net/projects/pydiction/ Don't know how good it is, but it looks like it'd do the job. Ed On 21/09/05, Gabriel Farrell [EMAIL PROTECTED] wrote: Uh oh, looks like you're begging for an editor war. That said, I'm in the vim camp. It can do everything you specified for all of the languages you mention (well, I'm not sure about collapsible code...web search...aha![1]). After using it for four years, I'm still learning new tricks (see, for example, this page I found today on indentation[2]). vim's extendable with python scripts, but a lot of what you need for coding is already built in. I find most of my info either in the help manual that comes with it (:h) or at vim.org. gsf [1] http://www.dgp.toronto.edu/~mjmcguff/learn/vim/folding.txt [2] http://www.vim.org/tips/tip.php?tip_id=83 On Wed, Sep 21, 2005 at 02:00:20PM +0100, Ed Singleton wrote: I've been trying to decide which editor to use to edit Python (on Windows mostly). My wishlist of features would be: - automatic code formatting (indentation etc) - collapsible code (to collapse def's etc) - automatic code coloring (that's easily changeable) - auto-completion of namespaces - easy to run scripts from the editor (a shortcut key to run them or something) As I also do a lot of html, css and javascript it would be cool to have an editor that could also handle them, in which case I would want the same features for those languages, as well as the ability to write macros, scripts, etc in python. Having looked at loads of editors, I've ended up looking at emacs and vim. Emacs seems too difficult with not enough support for using the mouse. Vim seemed better, and I get the impression that it is possible to use python to script the editor, but I can't find much information on using vim as a python editor on windows. My various questions are: What other features should I be looking for? What would be the best editor for a beginner to start using, with a view to the long term? Where can I find some authoritative information about setting emacs or vim up as a fully featured python editor? Thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Multiple Simultaneous Loops
I roughly want to be able to do: for f, x in bunch_of_files, range(z): so that x iterates through my files, and y iterates through something else. Is this something I can do? If so, what would be the best way to create a range of indeterminate length? If not, is there a nice way I can do it, rather than than incrementing a variable (x = x + 1) every loop? Or maybe can I access the number of times the loop has run? ('x = x + 1' is so common there must be some more attractive shortcut). So far in learning Python I've founbd that when I feel you should be able to do something, then you can. This seems a pretty intuitive thing to want to do, so I'm sure it must be possible, but I can't find anything on it. Many thanks Ed ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Multiple Simultaneous Loops
Wonderful, thank you all of you. zip, enumerate, and count seem to do everything I want, though I do think for f, x in bunch_of_files, range(z): is a little more intuitive than for f, x in zip(bunch_of_files, range(z)): Thanks Ed On 15/09/05, Kent Johnson [EMAIL PROTECTED] wrote: Ed Singleton wrote: I roughly want to be able to do: for f, x in bunch_of_files, range(z): so that x iterates through my files, and y iterates through something else. Is this something I can do? In the general case use zip(): for f, x in zip(bunch_of_files, range(z)): In this case, where the second item is just the index to the loop, use enumerate() instead of range() and zip() for x, f in enumerate(bunch_of_files): If so, what would be the best way to create a range of indeterminate length? itertools.count() generates an unlimited sequence. If not, is there a nice way I can do it, rather than than incrementing a variable (x = x + 1) every loop? Or maybe can I access the number of times the loop has run? ('x = x + 1' is so common there must be some more attractive shortcut). enumerate() So far in learning Python I've founbd that when I feel you should be able to do something, then you can. Yep :-) Kent ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor