[RELEASE] Python 2.7.6
Python 2.7.6 is now available. This release resolves crashes of the interactive interpreter on OS X 10.9. The final release also fixes several issues identified in the release candidate. Importantly, a security bug in CGIHTTPServer was fixed [1]. Thank you to those who tested the 2.7.6 release candidate and reported these bugs! All the changes in Python 2.7.6 are described in full detail in the Misc/NEWS file of the source tarball. You can also view online at http://hg.python.org/cpython/raw-file/99d03261c1ba/Misc/NEWS Downloads are at http://python.org/download/releases/2.7.6/ As always, report bugs to http://bugs.python.org/ Have a nice November, Benjamin Peterson 2.7 Release Manager [1] http://bugs.python.org/issue19435 -- https://mail.python.org/mailman/listinfo/python-announce-list Support the Python Software Foundation: http://www.python.org/psf/donations/
Re: The narcissism of small code differences
I never thought I'd be saying this but welcome back Rick :) On 11/11/2013 06:50, Rick Johnson wrote: On Saturday, November 9, 2013 6:42:04 AM UTC-6, Steven D'Aprano wrote: Uses an example written in Ruby, but don't let that put you off: Why would it? I write Ruby code all the time. Ruby code in and of itself does not bother me, what bothers me about Ruby is the ease at which a programmer can write inconsistent and convoluted code -- evidenced by the poor examples in your linked article. Case in point. To save anyone else from reading this long-winded blab fest chalk full the driest humor and cyclic illogical meandering that could make a ferris-wheel blush with jealousy... In a nutshell the author attempts to plead for the longevity of old code bases simply on the basis of his assertion that old code bases are less buggy and contain more wisdom than their new brethren -- both of which are absurd conclusions! I recall that the demise of Netscape was due to them trying to completely rewrite code of this nature. The exception that proves the rule? -- Python is the second best programming language in the world. But the best has yet to be invented. Christian Tismer Mark Lawrence -- https://mail.python.org/mailman/listinfo/python-list
Re: Languages for different purposes (was Re: New user's initial thoughts / criticisms of Python)
* Some languages are just fundamentally bad. The flexible string representation is a perfect exemple. Again, a short explanation: This FSR splits unicode in chunks. Two immediate consequences: - It's necessary to keep track of each individual internal pieces of text. - It's necessary to waste time in switching between the internal coding schemes. Bad memory and bad performance at the same time. In fact, with such a mechanism, it is even impossible to write an editor. jmf I do not recommend ever writing production code in Whitespace, Ook, or Piet. * Some languages force you to do a lot of bookkeeping, memory management, etc. These are inferior unless their corresponding advantages (usually performance or memory use) justify it. * Some situations specifically demand one language. If you're writing code to be deployed on cheap web servers, it's probably going to have to be in PHP. If it's to run inside a web browser, it pretty much has to be JavaScript, ActionScript, or maybe something that compiles to one of those. But that would still leave you with a good few choices. When it comes down to it, how do you choose between Ruby, Python, Perl, Pike, JavaScript, insert language of choice here, etcetera? I can think of a few considerations that may or may not be important... and I'm sure you can add more. - Library support. For web work, it might be useful to be able to create a PNG image on the fly (live graphs and such), or to have a simple one-liner that handles cookies and persistence. - Familiarity with the language. Why learn another one when you already know this one? - *Un*familiarity with the language. If you're going to have to learn, may as well charge your boss for it! - Proper Unicode support. For manipulating text, helps to be able to work with it as text. - Lack of proper Unicode support. Maybe it's easier to just work with bytes everywhere? :) - Ease/atomicity of deployment of new versions (maybe even while it's running) - Buzzwordiness? If your boss asks you to choose a language and you can say either Ruby on Rails or CherryPy, are you more likely to get approval for the former? Something to throw open there. Citations from actual choices made a bonus. :) ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: To whoever hacked into my Database
Στις 6/11/2013 5:25 μμ, ο/η Νίκος Γκρ33κ έγραψε: Okey let the hacker try again to mess with my database!!! He is done it twice, lets see if he will make it again! I'am waiting! I can't believe your ignorance. You're actually telling a huge group of developers from all over the globe that your site is impenetrable. Do you know how ridiculous you sound? Have you stopped and thought that maybe people have better things to do than try to hack your stupid circa 1990 website? My three year old could have modified your database. It doesn't take a pro to take down your 'security'. Have you not read up on anything these people have suggested? Cross Site Scripting? SQL Injection? Digital Piracy? Private User Information? No.. you haven't. That's why your code is starting to look like this: if not '..' in page and not page == '/etc/passwd' and os.path.isfile(page) and os.path.exists('/cgi-bin' + page) and cookieID == 'some_secret' and host == 'superhost.gr' and hacker_is_not_being_mean_today: load_site() load_private_user_phone_numbers_and_then_post_a_screenshot_for_everyone_to_see() else: play_pre_millenium_music_and_load_lots_of_gifs() wait___go_back_and_load_pirated_music_and_gifs_from_1995_anyway(extra_sauce=True) You can't sue me for posting the code to your site, there was no copyright. I guess my whole point is, if someone really cared I'm sure they could get into your site. They could get into a lot of sites that were created by people way smarter than you. Ever heard of apache exploits? cpanel exploits? for that matter..python exploits? Some of this is beyond your control. Actually, all of this is beyond your personal control, you lack the capability. What I meant to say is that you could not possibly fix all of this even if you were a better python programmer. Be glad 'she' wasn't mean. == Somebody this morning sent me an email as nikos.su...@gmail.com sayign the above. My code is not like you provided you ignorant. # is it a python file or an html template? if page and page in os.listdir( cgi_path ): pyvalid = True elif os.path.isfile( file ): page = file.replace( path, '' ) htmlvalid = True else: file = 'forbidden' if 'forbidden' in file: print( '''h2font color=redΔεν επιτρέπεται η απευθείας πρόσβαση στο script παρά μόνον μέσω της αρχικής σελίδας!Ανακατεύθυνση σε 5...''' ) print( '''meta http-equiv=REFRESH content=5;URL=http://superhost.gr;''' ) sys.exit(0) if cookieID != 'wont_say' and ( htmlvalid or pyvalid ) and re.search( r'(amazon|google|proxy|cloud|reverse|fetch|msn|who|spider|crawl|ping)', host ) is None: # do database insertion here Tell the mighty female hacker to polish her nails, do her hair and fix a good meal. She is incompetent just like yourself. These all is just an excuse of not being able to mess with my script again, because is she could she would. -- https://mail.python.org/mailman/listinfo/python-list
fd leak in parent process for logger.
Hi All, I have server process which spawns a process for each request. Where parent process is leaking fd for logger. Please find example code. from threading import Thread from multiprocessing import Process from time import sleep import logging from uuid import uuid4 class ChildFile(object): def __init__(self): self.logger = logging.getLogger('test') fh = logging.FileHandler('/tmp/test'+str(uuid4())) fh.setLevel(logging.INFO) self.logger.addHandler(fh) self.fd = open('test2', 'wb') def run(self): self.logger.info('dummy run') def child_file_creator(): a = ChildFile() child_process = Process(target=a.run) child_process.start() child_process.join() if __name__ == '__main__': print 'parent process run' while True: child_file_creator() sleep(10) 1) after child process exits. 2) For parent process, still fd remains open. one can check out using, cd /proc/23223/fd ravindra@ravindra-Ideapad-Z570:/proc/23223/fd$ ls -ltr total 0 l-wx-- 1 ravindra ravindra 64 Nov 11 15:10 6 - /tmp/test62bba7f1-223c-4c17-a483-f6d92ab67222 l-wx-- 1 ravindra ravindra 64 Nov 11 15:10 5 - /tmp/test2946cdf6-7e4c-4979-b56a-fd2cc698 l-wx-- 1 ravindra ravindra 64 Nov 11 15:10 4 - /tmp/test0488579b-10d7-4635-abb0-a31a0ea79eeb lr-x-- 1 ravindra ravindra 64 Nov 11 15:10 3 - /dev/urandom lrwx-- 1 ravindra ravindra 64 Nov 11 15:10 2 - /dev/pts/19 lrwx-- 1 ravindra ravindra 64 Nov 11 15:10 1 - /dev/pts/19 lrwx-- 1 ravindra ravindra 64 Nov 11 15:10 0 - /dev/pts/19 3) while normal file descriptor of open 'test2' is closed. But fd attached to logger is leaking. How can I close for the same for logger object. Thanks and Regards, Ravindra M -- https://mail.python.org/mailman/listinfo/python-list
Implementing a multivibrator function with python
I am trying to implement a multivibrator function with python. This is how it works; - An trigger event happens - Upon receiving the event, a variable goes high for 5secs, then go low. - If the event happens again before the 5secs expire, the high duration will be extended by another 5 secs. This works like a retriggerable multivibrator for those who are into electronics. Is there some sample code for this problem or can someone point me to using the right library for this feature? Thank you very much. -- https://mail.python.org/mailman/listinfo/python-list
Re: The narcissism of small code differences
On Mon, Nov 11, 2013 at 8:25 PM, Mark Lawrence breamore...@yahoo.co.uk wrote: On 11/11/2013 06:50, Rick Johnson wrote: In a nutshell the author attempts to plead for the longevity of old code bases simply on the basis of his assertion that old code bases are less buggy and contain more wisdom than their new brethren -- both of which are absurd conclusions! I recall that the demise of Netscape was due to them trying to completely rewrite code of this nature. The exception that proves the rule? No, I would say Netscape's experience is a strong supporting example of the contrary position. I've frequently had need to reimplement something (most recently as part of porting functionality from RosMud, written in C++, to Gypsum, written in Pike), and referencing the old code is the best way to benefit from X years of corner-case discoveries and bug fixes. Sometimes I'll even copy and paste a comment from one version to another, because it perfectly explains some oddity that the code has to handle - even if the code itself is completely rewritten. Definitely if hunks of code can be kept, they should be. The old code base *IS* less buggy and contains more wisdom. Hardly absurd. ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: Languages for different purposes (was Re: New user's initial thoughts / criticisms of Python)
On Mon, Nov 11, 2013 at 8:28 PM, wxjmfa...@gmail.com wrote: * Some languages are just fundamentally bad. The flexible string representation is a perfect exemple. Wow. A new low for you, jmf... comparing PEP 393 to Ook?!? In fact, with such a mechanism, it is even impossible to write an editor. And somehow a performance tradeoff makes Python no longer Turing complete. ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
Στις 8/11/2013 11:11 μμ, ο/η Νίκος Αλεξόπουλος έγραψε: Is there someway to write the following line even better with the ability to detect daylight saving time by itself so i don't have to alter the line manually when time changes? lastvisit = ( datetime.utcnow() + timedelta(hours=2) ).strftime( '%y-%m-%d %H:%M:%S' )# MySQL datetime format Thanks. Someone has an idea what to add to this line to automatically adjust itself if DST happens? -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
Regarding the select statement, I think the most Pythonic approach is using dictionaries rather than nested ifs. Supposing we want to decode abbreviated day names (mon) to full names (Monday): day_abbr='mon' day_names_mapping={ 'mon':'Monday', 'tue':'Tuesday', 'wed':'Wednesday', 'thu':'Thursday', 'fri':'Friday', 'sat':'Saturday', 'sun':'Sunday' } try: full_day_name=day_names_mapping[day_abbr.casefold()] except KeyError: raise GoodLuckFixingItException('We don't have '+day_abbr+' in our week') This style is more compact (usually one line per case) and more meaningful (generic processing driven by separate data) than a pile of if statement, and more flexible: full_day_names=('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday') day_names={x.casefold()[0:3] : x for x in full_day_names} # A dict can also contain tuples, lists, and nested dicts, consolidating multiple switches over the same keys and organizing nested switches and other more complex control structures. -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On Mon, Nov 11, 2013 at 9:09 PM, lorenzo.ga...@gmail.com wrote: Regarding the select statement, I think the most Pythonic approach is using dictionaries rather than nested ifs. Supposing we want to decode abbreviated day names (mon) to full names (Monday): That's an obvious mapping, though. If you're using a select/switch statement to handle straight-forward one-to-one mappings, then yes, obviously the better way to do it is to use a dictionary. In the more general sense, a switch/case block is much more directly translated into if/elif/else statements. You can't, for instance, build up a dictionary that handles inequalities, but you can do that with elif. That is, normally you can't. I have occasionally built up mappings that handle inequalities - it's a form of denormalization. Consider the following logic: A 'minor weapon' is based on a roll of a 100-sided dice. If it's 01 to 70, +1 weapon: 2,000gp [weapon]; if it's 71 to 85, +2 weapon: 8,000gp [weapon]; if 86 to 90, Specific weapon [minor specific weapon]; and if 91 to 100, Special ability [minor special weapon] and roll again. My code to handle that starts out with this array: minor weapon:({ 70,+1 weapon: 2,000gp [weapon], 85,+2 weapon: 8,000gp [weapon], 90,Specific weapon [minor specific weapon], 100,Special ability [minor special weapon] and roll again, }), (that's Pike; in Python it'd be a list, or maybe a tuple of tuples), and denormalizes it into a lookup table by creating 70 entries quoting the first string, 15 quoting the second, 5, and 10, respectively. So, with a bit of preprocessing, a lookup table (which in this case is an array (list), but could just as easily be a dict) can be used to handle inequalities. But this is because lookup tables can be treated as data, where if/elif/else blocks have to be code; there are roughly 42 million such lookup tables in the code I snagged that from, and having code for each one would work out far less manageable. Normally, you'll want to render inequalities with code as if/elif. ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: Implementing a multivibrator function with python
On Mon, 11 Nov 2013 01:41:58 -0800 (PST), JL lightai...@gmail.com wrote: - If the event happens again before the 5secs expire, the high duration will be extended by another 5 secs. This works like a retriggerable multivibrator for those who are into electronics. More precisely a retriggerable monostable multivibrator. The question makes little sense unless you're running in an event driven environment, such as a gui. Name the environment and somebody can probably help. -- DaveA -- https://mail.python.org/mailman/listinfo/python-list
Re: Implementing a multivibrator function with python
On 11/11/2013 4:41 AM, JL wrote: I am trying to implement a multivibrator function with python. This is how it works; - An trigger event happens - Upon receiving the event, a variable goes high for 5secs, then go low. - If the event happens again before the 5secs expire, the high duration will be extended by another 5 secs. This works like a retriggerable multivibrator for those who are into electronics. Is there some sample code for this problem or can someone point me to using the right library for this feature? Python 3.4 will have a new asyncio package that includes an event loop module. It will be in the forthcoming 3.4.b0 release; it might be in 3.4.a4 but I have not installed that yet. In any case, I believe it should make the above easy. -- Terry Jan Reedy -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On Mon, 11 Nov 2013 21:39:27 +1100, Chris Angelico wrote: My code to handle that starts out with this array: minor weapon:({ 70,+1 weapon: 2,000gp [weapon], 85,+2 weapon: 8,000gp [weapon], 90,Specific weapon [minor specific weapon], 100,Special ability [minor special weapon] and roll again, }), (that's Pike; in Python it'd be a list, or maybe a tuple of tuples), and denormalizes it into a lookup table by creating 70 entries quoting the first string, 15 quoting the second, 5, and 10, respectively. Ewww :-( Imagine having to print out the dict looking for an error in the lookup table. Or imagine the case where you have: 0...2: do this 20001...890001: do that 890001...890003: do something else Don't get me wrong, it's a clever and reasonable solution for your specific use-case. But I'd much rather have a lookup table variant that matches on intervals. Hmmm... if you had an interval data type, which was hashable, that would probably be trivial... what am I missing? Ah, of course, what I'm missing is that although you're storing intervals as the keys, you're matching regular ints. I wonder if this would be a good use-case for Antoine Pitrou's TransformDict? http://www.python.org/dev/peps/pep-0455/ -- Steven -- https://mail.python.org/mailman/listinfo/python-list
Getting globals of the caller, not the defining module
Suppose I have a function that needs access to globals: # module A.py def spam(): g = globals() # this gets globals from A introspect(g) As written, spam() only sees its own globals, i.e. those of the module in which spam is defined. But I want spam to see the globals of the caller. # module B import A A.spam() # I want spam to see globals from B I can have the caller explicitly pass the globals itself: def spam(globs=None): if globs is None: globs = globals() introspect(globs) But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? -- Steven -- https://mail.python.org/mailman/listinfo/python-list
Re: Getting globals of the caller, not the defining module
On Mon, Nov 11, 2013 at 10:25 PM, Steven D'Aprano steve+comp.lang.pyt...@pearwood.info wrote: But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? You're playing with introspection, so I'd look at poking around in the stack trace. It'll be esoteric, but I think this is the right place to use it. ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On Mon, Nov 11, 2013 at 10:17 PM, Steven D'Aprano steve+comp.lang.pyt...@pearwood.info wrote: On Mon, 11 Nov 2013 21:39:27 +1100, Chris Angelico wrote: denormalizes it into a lookup table by creating 70 entries quoting the first string, 15 quoting the second, 5, and 10, respectively. Ewww :-( Imagine having to print out the dict looking for an error in the lookup table. Or imagine the case where you have: 0...2: do this 20001...890001: do that 890001...890003: do something else Don't get me wrong, it's a clever and reasonable solution for your specific use-case. But I'd much rather have a lookup table variant that matches on intervals. Of course it's Ewww in isolation :) But just imagine there are piles and piles of these tables, themselves keyed by keyword, and I want to be able to let untrusted people create tables (which means they basically have to be data, not code). Also, bear in mind, all the tables are based around dice that can be physically rolled, so none has more than 100 entries after denormalization. Quite a lot of the tables actually have unique entries per value (eg it's a d10 roll, with ten unique outputs), so it's simplest to just turn all the tables into that format; that way, the main code needs worry about one type only, and the preprocessor handles the denormalization. And if there's an error in the lookup table, well, you look at the normalized version, not at the one that actually gets parsed :) That's basically like looking back at the Python source code rather than the disassembled byte-code; apart from actually debugging the preprocessor itself (which can be done with a ten-entry table that's easily eyeballed), the denormalized version needn't be looked at by a human. But this is a very VERY specific situation. Normally it's best to just use an if/elif block. That's why this looks so Ewww. :) ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On 2013-11-11 10:39, Chris Angelico wrote: A 'minor weapon' is based on a roll of a 100-sided dice. If it's 01 to 70, +1 weapon: 2,000gp [weapon]; if it's 71 to 85, +2 weapon: 8,000gp [weapon]; if 86 to 90, Specific weapon [minor specific weapon]; and if 91 to 100, Special ability [minor special weapon] and roll again. My code to handle that starts out with this array: minor weapon:({ 70,+1 weapon: 2,000gp [weapon], 85,+2 weapon: 8,000gp [weapon], 90,Specific weapon [minor specific weapon], 100,Special ability [minor special weapon] and roll again, }), (that's Pike; in Python it'd be a list, or maybe a tuple of tuples), and denormalizes it into a lookup table by creating 70 entries quoting the first string, 15 quoting the second, 5, and 10, respectively. So, with a bit of preprocessing, a lookup table (which in this case is an array (list), but could just as easily be a dict) can be used to handle inequalities. But this is because lookup tables can be treated as data, where if/elif/else blocks have to be code; there are roughly 42 million such lookup tables in the code I snagged that from, and having code for each one would work out far less manageable. Normally, you'll want to render inequalities with code as if/elif. Heh. I've done pretty much exactly the same thing to implement an engine[1] to draw from the random tables on Abulafia[2] which have nearly the same structure. It scales up reasonably well beyond d100s. It's certainly not a technique I would pull out to replace one-off if-elif chains that you literally write, but it works well when you write the generic code once to apply to many tables. [1] http://rollmeup.mechanicalkern.com/ [2] http://www.random-generator.com/index.php?title=Main_Page -- Robert Kern I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth. -- Umberto Eco -- https://mail.python.org/mailman/listinfo/python-list
Re: Help - Exercise Decision
Em domingo, 10 de novembro de 2013 19h56min45s UTC-3, Kennedy Salvino escreveu: I'm trying to make a ranking of 3 numbers and say which the greatest and consider whether there is a tie between them, I am not able to make the conditions of draws. Code in PT-BR: http://pastebin.com/18pYJjPC My teacher asked .. I will try to do as you said. -- https://mail.python.org/mailman/listinfo/python-list
Re: Help - Exercise Decision
My teacher asked .. I will try to do as you said. -- https://mail.python.org/mailman/listinfo/python-list
Re: Getting globals of the caller, not the defining module
(Sorry for posting through GG, I'm at work.) On Monday, November 11, 2013 11:25:42 AM UTC, Steven D'Aprano wrote: Suppose I have a function that needs access to globals: # module A.py def spam(): g = globals() # this gets globals from A introspect(g) As written, spam() only sees its own globals, i.e. those of the module in which spam is defined. But I want spam to see the globals of the caller. # module B import A A.spam() # I want spam to see globals from B I can have the caller explicitly pass the globals itself: def spam(globs=None): if globs is None: globs = globals() introspect(globs) But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? How about this? # module A.py import inspect def spam(): return inspect.stack()[1][0].f_globals # module B.py import A print(A.spam() is globals()) # prints True def f(): return A.spam() # module C.py import B print(B.f() is vars(B)) # prints True I don't really know what I'm doing but I guess it won't work in alternative implementations of Python. -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On Mon, Nov 11, 2013 at 10:53 PM, Robert Kern robert.k...@gmail.com wrote: Heh. I've done pretty much exactly the same thing to implement an engine[1] to draw from the random tables on Abulafia[2] which have nearly the same structure. It scales up reasonably well beyond d100s. It's certainly not a technique I would pull out to replace one-off if-elif chains that you literally write, but it works well when you write the generic code once to apply to many tables. I'd trust my current code for several orders of magnitude beyond where I'm currently using it, but as Steven said, you really don't want to be manually looking at the denormalized tables. Since all the strings are referenced anyway, having a lookup array of (say) 1,000,000 object pointers is fairly cheap. lst = [Low if i50 else High for i in range(100)] sys.getsizeof(lst) 4348736 That's pretty close to four bytes per entry, which would be the cheapest you could hope for on a 32-bit system. 10% overhead is quite acceptable. And this is a fairly extreme example :) ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On Mon, Nov 11, 2013 at 4:57 AM, Νίκος Αλεξόπουλος nikos.gr...@gmail.com wrote: Στις 8/11/2013 11:11 μμ, ο/η Νίκος Αλεξόπουλος έγραψε: Is there someway to write the following line even better with the ability to detect daylight saving time by itself so i don't have to alter the line manually when time changes? lastvisit = ( datetime.utcnow() + timedelta(hours=2) ).strftime( '%y-%m-%d %H:%M:%S' )# MySQL datetime format Thanks. Someone has an idea what to add to this line to automatically adjust itself Three days ago Mark Lawrence pointed you to a stack overflow answer to your question. While it didn't suit your demand for a single line answer, it could easily be made into a function which returned the string format that you requested. You've been around long enough to try to work that out for yourself. If you yourself had returned with a one liner to perform what Mark showed you, I can imagine a lot of people would be impressed at your dedication! I think you are oversimplifying the problem. I recall that you server is in Germany, and you are in Greece. If these are two different time zones, I am guessing that the German time will be given. Also, any linux user who runs package updates regularly (thinking Ubuntu) realizes that some file that starts with tz gets changed quite often. This is because time zones are set by governments, and the date of change from standard to daylight time can be differently, depending upon the location and the governing body. I pose this question to you: Why not display UTC? If it is so important to you to display local time, why do you think that your host's local time is something that is useful for a visitor? Daylight savings time is more complicated that you have suggested if DST happens? If you insist upon displaying the local time of your server, you should not be hardcoding in a 2 hour difference. Let the python library figure out the delta by giving the country code -- https://mail.python.org/mailman/listinfo/python-list -- Joel Goldstick http://joelgoldstick.com -- https://mail.python.org/mailman/listinfo/python-list
Re: fd leak in parent process for logger.
In article e0d265f9-801d-4ab2-8c82-0d9723603...@googlegroups.com, ravindrapa...@gmail.com wrote: Hi All, I have server process which spawns a process for each request. Where parent process is leaking fd for logger. Please find example code. You've got a lot of code here. The first thing to do when trying to debug a problem like this is get rid of anything that's not essential to demonstrating the problem. You import Thread, but don't appear to use it. Get rid of the import line. You also do this in a loop. Can you demonstrate the same problem with a single pass? Anyway, my guess here is that the logging package is keeping a reference to your log file when you create each FileHandler. Try configuring the logger in your run() method instead of __init__(). I believe (untested) that will make the file get opened in the child process. from threading import Thread from multiprocessing import Process from time import sleep import logging from uuid import uuid4 class ChildFile(object): def __init__(self): self.logger = logging.getLogger('test') fh = logging.FileHandler('/tmp/test'+str(uuid4())) fh.setLevel(logging.INFO) self.logger.addHandler(fh) self.fd = open('test2', 'wb') def run(self): self.logger.info('dummy run') def child_file_creator(): a = ChildFile() child_process = Process(target=a.run) child_process.start() child_process.join() if __name__ == '__main__': print 'parent process run' while True: child_file_creator() sleep(10) 1) after child process exits. 2) For parent process, still fd remains open. one can check out using, cd /proc/23223/fd ravindra@ravindra-Ideapad-Z570:/proc/23223/fd$ ls -ltr total 0 l-wx-- 1 ravindra ravindra 64 Nov 11 15:10 6 - /tmp/test62bba7f1-223c-4c17-a483-f6d92ab67222 l-wx-- 1 ravindra ravindra 64 Nov 11 15:10 5 - /tmp/test2946cdf6-7e4c-4979-b56a-fd2cc698 l-wx-- 1 ravindra ravindra 64 Nov 11 15:10 4 - /tmp/test0488579b-10d7-4635-abb0-a31a0ea79eeb lr-x-- 1 ravindra ravindra 64 Nov 11 15:10 3 - /dev/urandom lrwx-- 1 ravindra ravindra 64 Nov 11 15:10 2 - /dev/pts/19 lrwx-- 1 ravindra ravindra 64 Nov 11 15:10 1 - /dev/pts/19 lrwx-- 1 ravindra ravindra 64 Nov 11 15:10 0 - /dev/pts/19 3) while normal file descriptor of open 'test2' is closed. But fd attached to logger is leaking. How can I close for the same for logger object. Thanks and Regards, Ravindra M -- https://mail.python.org/mailman/listinfo/python-list
Re: Implementing a multivibrator function with python
Op 11-11-13 10:41, JL schreef: I am trying to implement a multivibrator function with python. This is how it works; - An trigger event happens - Upon receiving the event, a variable goes high for 5secs, then go low. - If the event happens again before the 5secs expire, the high duration will be extended by another 5 secs. This works like a retriggerable multivibrator for those who are into electronics. Is there some sample code for this problem or can someone point me to using the right library for this feature? Thank you very much. The problem is that it depnds on the kind of trigger event. Is it a signal? Is it a character that arrives through a pipe or socket? I would take a look at the signal module and see if it can get you started. -- Antoon Pardon -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On Saturday, November 9, 2013 10:30:26 AM UTC-6, rusi wrote: print ( {mon:mondays suck, tue:at least it's not monday, wed:humpday }.get(day_of_week,its some other day) ) In article 8618d47d-518c-4f35-a879-57fad7525...@googlegroups.com, Rick Johnson rantingrickjohn...@gmail.com wrote: Proper code formatting can do WONDERS for readability! d = { mon:mondays suck, tue:at least it's not monday, wed:humpday } default = some other day target = tue print d.get(target, default) target = blah print d.get(target, default) I agree that Rick's version is better than rusi's version, but possibly not for the the reason Rick thinks it is :-) rusi's version has a parsing surprise in it. As a human scans the code, the thought process goes something like this: print ( {mon:mondays suck, OK, I'm going to print a dictionary tue:at least it's not monday, Yeah, still looks like I'm printing a dictionary wed:humpday Yeah, more dictionary, this still makes sense, I'm just waiting to get to the and of the dictionary so I can print it }.get(day_of_week,its some other day) Oh, my! I'm not printing a dictionary after all! I'm doing a get() on it! ) Ugh, what's this close paren? Does it terminate the get(), or the print()? I need to go back and count open parens to make sure -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
In article mailman.2377.1384177268.18130.python-l...@python.org, Joel Goldstick joel.goldst...@gmail.com wrote: Why not display UTC? If it is so important to you to display local time, why do you think that your host's local time is something that is useful for a visitor? In general, it makes sense to run servers (and log everything) in UTC, and display local time to your users. The idea is to do the conversion (in both directions) as close to the user as possible (which, for a web application, means a little piece of javascript right in the browser). It seems like extra work, but, trust me, it will preserve your sanity eventually. We've got a data supplier who (for reasons I cannot fathom), runs their network in local time. Every time we talk to them about problems, it's a mess just trying to figure out what time we're talking about. We say, we saw a latency spike at 2243 UTC, what caused that?, and then we play 20-questions trying to figure out if that's 1443 PDT, or 1543 PST, or who knows what. Further complicated by them occasionally asking us off-the-wall questions like, Is that UTC daylight savings time? -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On Tue, Nov 12, 2013 at 1:14 AM, Roy Smith r...@panix.com wrote: We've got a data supplier who (for reasons I cannot fathom), runs their network in local time. Every time we talk to them about problems, it's a mess just trying to figure out what time we're talking about. We say, we saw a latency spike at 2243 UTC, what caused that?, and then we play 20-questions trying to figure out if that's 1443 PDT, or 1543 PST, or who knows what. Further complicated by them occasionally asking us off-the-wall questions like, Is that UTC daylight savings time? UGH. Yes. I get the same thing from some of the US players in my Dungeons Dragons campaign. To avoid the hassles of international times, everything's scheduled in UTC; the Aussies, the Europeans, and _some of_ the Americans an handle it, but there are a few who keep asking me crazy questions about DST and UTC. I'm like... no, there is no daylight time! Just look at the current UTC time and see how that compares! There's even a command in-game that shows current UTC time. Fortunately, those people are in the minority. Most of the players can handle the time conversions. ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
So this is a physics joke. The engineers and physicists at the conference went to dinner. They ordered wine with dinner. The wait person asked: Would you like the small liter, or the large liter? -- Joel Goldstick http://joelgoldstick.com -- https://mail.python.org/mailman/listinfo/python-list
Re: Languages for different purposes (was Re: New user's initial thoughts / criticisms of Python)
On 11/11/2013 09:28, wxjmfa...@gmail.com wrote: * Some languages are just fundamentally bad. The flexible string representation is a perfect exemple. Again, a short explanation: This FSR splits unicode in chunks. Two immediate consequences: - It's necessary to keep track of each individual internal pieces of text. - It's necessary to waste time in switching between the internal coding schemes. Bad memory and bad performance at the same time. In fact, with such a mechanism, it is even impossible to write an editor. jmf For the benefit of newbies, lurkers or whatever please ignore the rubbish written by Joseph McCarthy Faust regarding PEP 393 and the Flexible String Representation. He keeps making these false claims in double spaced google crap despite having been shot down in this thread https://groups.google.com/forum/#!topic/comp.lang.python/JkVQT0Wbq1A[1-25-false], where he was asked to provide evidence to support his claims. he didn't do so then, he's been asked repeatedly since to do so but hasn't because he can't, hence his newly aquired nickname. -- Python is the second best programming language in the world. But the best has yet to be invented. Christian Tismer Mark Lawrence -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On Monday, November 11, 2013 7:31:07 PM UTC+5:30, Roy Smith wrote: On Saturday, November 9, 2013 10:30:26 AM UTC-6, rusi wrote: print ( {mon:mondays suck, tue:at least it's not monday, wed:humpday }.get(day_of_week,its some other day) ) Rick Johnson wrote: Proper code formatting can do WONDERS for readability! d = { mon:mondays suck, tue:at least it's not monday, wed:humpday } default = some other day target = tue print d.get(target, default) target = blah print d.get(target, default) I agree that Rick's version is better than rusi's version, but possibly not for the the reason Rick thinks it is :-) rusi's version has a parsing surprise in it. As a human scans the code, the thought process goes something like this: Yes I did not like my own version for similar reason: I expect the switch order (classic C) to be 1. expression 2. body 3. default The following does not quite do it but is it better? def switch(val, default, body_dict): return body_dict.get(val,default) day=... switch(day, something else, {mon : mondays suck, tue : at least it's not monday, wed : humpday } ) Of course one can flip the body and the default but I find that looks more confusing. -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On Saturday, November 9, 2013 8:27:02 AM UTC-5, Joshua Landau wrote: The C switch statement is very limited. The select statement in the dialect of BASIC I regularly use is more flexible. It's more concise on long if chains because it elides the end ifs. But the use of indentation for blocks and the in operator certainly reduce the need for it in Python. It's say the C switch isn't limited enough to be a Python resident. The default fallthrough, labels, jumps and breaks make it a poor Python construct. KR have this to say: Falling through from one case to another is not robust, being prone to disintegration when the program is modified. So Python would need something simler. Once you winnow it down to a robust feature, it provide virtually nothing you don't get with an if/elif/else. At best it would save a temporary. The switch statement in (the language) go is similar, except that expression0 defaults to true and it doesn't elide expression0 in the case statements. Go makes interesting use of switch statements. In addition to what you might expect, you can also do type switches. A type switch lets you provide a different execution path depending on the underlying object represented by an interface. Thus, Go carved out a useful niche for a robust switch statement. Python used duck-typing instead of interfaces and generally doesn't need any special syntax for type checks, hence Go's version of switch doesn't make sense for Python, either. Go's cases must be constants, and allows optional fallthrough with the 'fallthrough' keyword. This forces them to provide break semantics to break out of a switch, which makes using them to break of an immediately outer loop messy. Dictionaries can't handle the uses where expression0 is constant and the case expressions are not. Function variables beg the question. How did you decide what to assign to the variable? A Python generator might take the place of that application, but I haven't tried it for that. I'd use this select if it was in Python, but I don't see much need for it. Same here. Perhaps the real value of a switch is that it seems to be a more natural way of thinking about execution. The caveat to that is most *actual* switch implementations are a mess. -- Neil Cerutti -- https://mail.python.org/mailman/listinfo/python-list
Install Tkinter for Windows 7 64-bit
I have installed Python 3.3, and i want to add a library with some basic functions like canvas and basic geomteric objects, fonts etc. Preferably something similar to the Javascript canvas. I've looked for graphic packages, and from what i can see something called Tkinter may be what i look for. However i have no luck install it, i installed something called Visual studio in hope it would incorporate Tkinter, but it did not and it also do not seem to work with 3.3 only 3.1 and below. Next i found ActiveStateTCL that from what i could see incorporated Tkinter library? But i have no luck runn the Tkinter example file i downloaded in idel, it still says no module called Tkinter. === Traceback (most recent call last): File D:\Python33\test2.py, line 16, in module from Tkinter import Tk, Canvas, Frame, BOTH ImportError: No module named 'Tkinter' === Maybe i should use some other module, i just need a canvas and the basic geometric objects functions line,rectangle,circle and some font. JT -- https://mail.python.org/mailman/listinfo/python-list
Re: Install Tkinter for Windows 7 64-bit
On 11/11/2013 16:38, jonas.thornv...@gmail.com wrote: I have installed Python 3.3, and i want to add a library with some basic functions like canvas and basic geomteric objects, fonts etc. Preferably something similar to the Javascript canvas. I've looked for graphic packages, and from what i can see something called Tkinter may be what i look for. However i have no luck install it, i installed something called Visual studio in hope it would incorporate Tkinter, but it did not and it also do not seem to work with 3.3 only 3.1 and below. Next i found ActiveStateTCL that from what i could see incorporated Tkinter library? But i have no luck runn the Tkinter example file i downloaded in idel, it still says no module called Tkinter. === Traceback (most recent call last): File D:\Python33\test2.py, line 16, in module from Tkinter import Tk, Canvas, Frame, BOTH ImportError: No module named 'Tkinter' === Maybe i should use some other module, i just need a canvas and the basic geometric objects functions line,rectangle,circle and some font. I'll let others comment on the use of Tk. But... The Tkinter module has been reorganised under Python 3.x: http://docs.python.org/3.3/library/tkinter.html#module-tkinter You're presumably working from a Python 2.x example TJG -- https://mail.python.org/mailman/listinfo/python-list
Re: Install Tkinter for Windows 7 64-bit
On 11/11/2013 16:38, jonas.thornv...@gmail.com wrote: === Traceback (most recent call last): File D:\Python33\test2.py, line 16, in module from Tkinter import Tk, Canvas, Frame, BOTH ImportError: No module named 'Tkinter' === In addition, I really don't recommend running your test scripts straight out of the Python install directory. Consider using a separate dev area somewhere else. TJG -- https://mail.python.org/mailman/listinfo/python-list
Re: Install Tkinter for Windows 7 64-bit
Here is the example file i have tried. #!/usr/bin/python # -*- coding: utf-8 -*- ZetCode Tkinter tutorial This program draws three rectangles filled with different colors. author: Jan Bodar last modified: January 2011 website: www.zetcode.com from Tkinter import Tk, Canvas, Frame, BOTH class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title(Colors) self.pack(fill=BOTH, expand=1) canvas = Canvas(self) canvas.create_rectangle(30, 10, 120, 80, outline=#fb0, fill=#fb0) canvas.create_rectangle(150, 10, 240, 80, outline=#f50, fill=#f50) canvas.create_rectangle(270, 10, 370, 80, outline=#05f, fill=#05f) canvas.pack(fill=BOTH, expand=1) -- https://mail.python.org/mailman/listinfo/python-list
Re: Install Tkinter for Windows 7 64-bit
On 11/11/2013 16:38, jonas.thornv...@gmail.com wrote: I have installed Python 3.3, and i want to add a library with some basic functions like canvas and basic geomteric objects, fonts etc. Preferably something similar to the Javascript canvas. I've looked for graphic packages, and from what i can see something called Tkinter may be what i look for. However i have no luck install it, i installed something called Visual studio in hope it would incorporate Tkinter, but it did not and it also do not seem to work with 3.3 only 3.1 and below. Next i found ActiveStateTCL that from what i could see incorporated Tkinter library? But i have no luck runn the Tkinter example file i downloaded in idel, it still says no module called Tkinter. === Traceback (most recent call last): File D:\Python33\test2.py, line 16, in module from Tkinter import Tk, Canvas, Frame, BOTH ImportError: No module named 'Tkinter' === Maybe i should use some other module, i just need a canvas and the basic geometric objects functions line,rectangle,circle and some font. JT Renamed in Python 3 to tkinter see http://www.python.org/dev/peps/pep-3108/#tkinter-package -- Python is the second best programming language in the world. But the best has yet to be invented. Christian Tismer Mark Lawrence -- https://mail.python.org/mailman/listinfo/python-list
Re: Install Tkinter for Windows 7 64-bit
On Mon, Nov 11, 2013 at 5:38 PM, jonas.thornv...@gmail.com wrote: But i have no luck runn the Tkinter example file i downloaded in idel, it still says no module called Tkinter. IDLE* === Traceback (most recent call last): File D:\Python33\test2.py, line 16, in module from Tkinter import Tk, Canvas, Frame, BOTH ImportError: No module named 'Tkinter' === In Python 3, 'Tkinter' was renamed to 'tkinter' (both sans quotes). Please change the file to reflect that (as the traceback points out, line 16). -- Chris “Kwpolska” Warrick http://kwpolska.tk PGP: 5EAAEA16 stop html mail | always bottom-post | only UTF-8 makes sense -- https://mail.python.org/mailman/listinfo/python-list
Re: Install Tkinter for Windows 7 64-bit
Den måndagen den 11:e november 2013 kl. 17:43:12 UTC+1 skrev Chris “Kwpolska” Warrick: On Mon, Nov 11, 2013 at 5:38 PM, jonas.thornv...@gmail.com wrote: But i have no luck runn the Tkinter example file i downloaded in idel, it still says no module called Tkinter. IDLE* === Traceback (most recent call last): File D:\Python33\test2.py, line 16, in module from Tkinter import Tk, Canvas, Frame, BOTH ImportError: No module named 'Tkinter' === In Python 3, 'Tkinter' was renamed to 'tkinter' (both sans quotes). Please change the file to reflect that (as the traceback points out, line 16). -- Chris “Kwpolska” Warrick http://kwpolska.tk PGP: 5EAAEA16 stop html mail | always bottom-post | only UTF-8 makes sense Thanks! -- https://mail.python.org/mailman/listinfo/python-list
Re: Install Tkinter for Windows 7 64-bit
On 11/11/2013 16:43, jonas.thornv...@gmail.com wrote: Here is the example file i have tried. #!/usr/bin/python # -*- coding: utf-8 -*- ZetCode Tkinter tutorial This program draws three rectangles filled with different colors. author: Jan Bodar last modified: January 2011 website: www.zetcode.com from Tkinter import Tk, Canvas, Frame, BOTH class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title(Colors) self.pack(fill=BOTH, expand=1) canvas = Canvas(self) canvas.create_rectangle(30, 10, 120, 80, outline=#fb0, fill=#fb0) canvas.create_rectangle(150, 10, 240, 80, outline=#f50, fill=#f50) canvas.create_rectangle(270, 10, 370, 80, outline=#05f, fill=#05f) canvas.pack(fill=BOTH, expand=1) That looks like it was written for Python 2 because in Python 3 the module is named tkinter. It's also lacking the part where it calls the .mainloop method. from tkinter import Tk, Canvas, Frame, BOTH class Example(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.initUI() def initUI(self): self.parent.title(Colors) self.pack(fill=BOTH, expand=1) canvas = Canvas(self) canvas.create_rectangle(30, 10, 120, 80, outline=#fb0, fill=#fb0) canvas.create_rectangle(150, 10, 240, 80, outline=#f50, fill=#f50) canvas.create_rectangle(270, 10, 370, 80, outline=#05f, fill=#05f) canvas.pack(fill=BOTH, expand=1) def main(): root = Tk() #root.geometry(250x150+300+300) app = Example(root) root.mainloop() if __name__ == '__main__': main() -- https://mail.python.org/mailman/listinfo/python-list
Re: Languages for different purposes (was Re: New user's initial thoughts / criticisms of Python)
On 11/11/2013 01:28 AM, wxjmfa...@gmail.com wrote: * Some languages are just fundamentally bad. The flexible string representation is a perfect exemple. Argh! He escaped! *chase* *scuffle* *stuff* *stuff* *stuff* Whew. Safely back in the troll bin. Okay, back to my day. -- ~Ethan~ -- https://mail.python.org/mailman/listinfo/python-list
Re: Languages for different purposes (was Re: New user's initial thoughts / criticisms of Python)
On Sunday, November 10, 2013 4:56:38 PM UTC+8, Jorgen Grahn wrote: On Sun, 2013-11-10, Chris Angelico wrote: On Sun, Nov 10, 2013 at 11:41 AM, Roy Smith r...@panix.com wrote: On 09/11/2013 22:58, Chris Angelico wrote: * Some languages are just fundamentally bad. I do not recommend ever writing production code in Whitespace, Ook, or Piet. One of the worst coding experiences I ever had was trying to build an app for a Roku media player. They have a home-grown language called BrightScript. Barf. And this is exactly why I was so strongly against the notion of developing an in-house scripting language. It may be a lot of work to evaluate Lua, Python, JavaScript, and whatever others we wanted to try, but it's a *lot* less work than making a new language that actually is worth using. Yes. I am baffled that people insist on doing the latter. Designing a limited /data/ language is often a good idea; designing something which eventually will need to become Turing-complete is not. Python is designed with the VM interpreter to execute compiled byte codes. Of course, C/C++/JAVA are lower level languages not designed in this way. To remedy the efficient part, cython and C-extensions are available in Python. -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On Mon, 11 Nov 2013 11:57:36 +0200, Νίκος Αλεξόπουλος wrote: lastvisit = ( datetime.utcnow() + timedelta(hours=2) ).strftime( '%y-%m-%d %H:%M:%S' )# MySQL datetime format Someone has an idea what to add to this line to automatically adjust itself if DST happens? Yes, but the scarcity of universal whitespace is preventing me from posting it. -- Denis McMahon, denismfmcma...@gmail.com -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On 11/11/2013 11:19 AM, Denis McMahon wrote: On Mon, 11 Nov 2013 11:57:36 +0200, Νίκος Αλεξόπουλος wrote: lastvisit = ( datetime.utcnow() + timedelta(hours=2) ).strftime( '%y-%m-%d %H:%M:%S' )# MySQL datetime format Someone has an idea what to add to this line to automatically adjust itself if DST happens? Yes, but the scarcity of universal whitespace is preventing me from posting it. Boy, are you in luck! I just happen to have a whole heap of marked down ascii white-space at bargain basement prices! -- ~Ethan~ -- https://mail.python.org/mailman/listinfo/python-list
dateutil.relativedelta.WE and friends?
I found a rather inscrutable use of dateutil recurrence rules in StackOverflow which generates a series of dates corresponding to the third Wednesday of the month: import dateutil.rrule as dr import dateutil.relativedelta as drel dt = datetime.datetime(2012, 1, 1, 0, 0) rule = dr.rrule(dr.MONTHLY, byweekday=drel.WE(3), dtstart=dt, count=12) -- https://mail.python.org/mailman/listinfo/python-list
Re: dateutil.relativedelta.WE and friends?
damn gmail. Please ignore the drivel below (and this top post)... Skip On Mon, Nov 11, 2013 at 2:33 PM, Skip Montanaro s...@pobox.com wrote: I found a rather inscrutable use of dateutil recurrence rules in StackOverflow which generates a series of dates corresponding to the third Wednesday of the month: import dateutil.rrule as dr import dateutil.relativedelta as drel dt = datetime.datetime(2012, 1, 1, 0, 0) rule = dr.rrule(dr.MONTHLY, byweekday=drel.WE(3), dtstart=dt, count=12) -- https://mail.python.org/mailman/listinfo/python-list
'isimmutable' and 'ImmutableNester'
I prepared a PEP and was wondering what your thoughts are about it: PEP:pep number Title: ``isimmutable(Obj)`` and/or ``ImmutableNester`` Version:version string Last-Modified: date string Author: Frank-Rene Schaefer, fsch...@users.sourceforge.net * BDFL-Delegate: PEP czar's real name * Discussions-To: fsch...@users.sourceforge.net Status: Draft Type: Standards Track | Informational | Process * Content-Type: text/x-rst * Requires: pep numbers Created:11-nov-2013 * Python-Version: 2.7.1 Post-History: dates of postings to python-list and python-dev * Replaces: pep number * Superseded-By: pep number * Resolution: url General Idea A built-in function 'isimmutable()' shall tell efficiently whether the object of concern is mutable or not. That is it must reflect on the whole object tree whether it contains mutable elements or not. For example, in the code fragment :: verdict_0 = isimmutable(3.14) verdict_1 = isimmutable((1,2,3)) verdict_2 = isimmutable(((1,2),(2,3),(3,4))) all verdicts are 'True' because the tested objects consist of purely immutable components. However, the ``x`` in :: x = (1,(2,abc, [1,2,3])) verdict = isimmutable(x) triggers the verdict to be 'False' because ``x[1][2]`` is a list and therefore mutable. It may be conceivable to have a special class-type called ``ImmutableNester`` which has no write-access member functions and does not allow its derived classes to have write-access member functions. Instead, any derived class aggregates members at the time of construction. At this point in time, when members are nested in the class, it is checked if the members are of subclasses of ``ImmutableNester``. The advantage of the ``isimmutable()`` function is that no extra class functionality needs to be implemented. The disadvantage is that the immutability must be checked manually and at each time the object is used. The ``ImmutableNester`` class type checks for immutability once, at construction time and no further manual checks are necessary. Rationale = If an object is immutable then copying of it can be safely be replaced by a setting of a reference. The principal scenario is when an instance A gives an instance B access to some data D under the provision that B does not change it. Therefore, B must either clone the data or it must be safe to assume that the data cannot change, i.e. is immutable. If the objects are large and/or many there a significant performance impact may raise from a deepcopy or manual cloning of objects. Therefore, the ``isimmutable()`` built-in function is key for a safe implementation of reference-instead-of-copying. Ensuring immutability is also key for the so called 'Flyweight Design Pattern'. -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On 2013-11-11, Ethan Furman et...@stoneleaf.us wrote: On 11/11/2013 11:19 AM, Denis McMahon wrote: On Mon, 11 Nov 2013 11:57:36 +0200, ?? ?? wrote: lastvisit = ( datetime.utcnow() + timedelta(hours=2) ).strftime( '%y-%m-%d %H:%M:%S' )# MySQL datetime format Someone has an idea what to add to this line to automatically adjust itself if DST happens? Yes, but the scarcity of universal whitespace is preventing me from posting it. Boy, are you in luck! I just happen to have a whole heap of marked down ascii white-space at bargain basement prices! Careful, a lot of the cheap imported whitespace was made with toxic lead carbonate instead of the non-toxic titatium oxide that should be used... -- Grant Edwards grant.b.edwardsYow! I'd like MY data-base at JULIENNED and stir-fried! gmail.com -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On 11 November 2013 10:39, Chris Angelico ros...@gmail.com wrote: On Mon, Nov 11, 2013 at 9:09 PM, lorenzo.ga...@gmail.com wrote: Regarding the select statement, I think the most Pythonic approach is using dictionaries rather than nested ifs. Supposing we want to decode abbreviated day names (mon) to full names (Monday): You can't [normally], for instance, build up a dictionary that handles inequalities, but you can do that with elif. [...] Consider the following logic: A 'minor weapon' is based on a roll of a 100-sided dice. If it's 01 to 70, +1 weapon: 2,000gp [weapon]; if it's 71 to 85, +2 weapon: 8,000gp [weapon]; if 86 to 90, Specific weapon [minor specific weapon]; and if 91 to 100, Special ability [minor special weapon] and roll again. My code to handle that starts out with this array: minor weapon:({ 70,+1 weapon: 2,000gp [weapon], 85,+2 weapon: 8,000gp [weapon], 90,Specific weapon [minor specific weapon], 100,Special ability [minor special weapon] and roll again, }), (that's Pike; in Python it'd be a list, or maybe a tuple of tuples), and denormalizes it into a lookup table by creating 70 entries quoting the first string, 15 quoting the second, 5, and 10, respectively. So, with a bit of preprocessing, a lookup table (which in this case is an array (list), but could just as easily be a dict) can be used to handle inequalities. The obvious way to me is a binary search: from bisect import bisect_left class FloorMap: def __init__(self, dct): self.indexes = sorted(list(dct)) self.dct = dct def __getitem__(self, itm): index = self.indexes[bisect_left(self.indexes, itm)] return self.dct[index] minor_weapon = FloorMap({ 70: +1 weapon: 2,000gp [weapon], 85: +2 weapon: 8,000gp [weapon], 90: Specific weapon [minor specific weapon], 100: Special ability [minor special weapon] and roll again }) minor_weapon[63] # '+1 weapon: 2,000gp [weapon]' The precise details of the wrapper class here are just to make initialisation pretty; it could be done straight from a pair of lists too: from bisect import bisect_left minor_weapon_indexes = 70, 85, 90, 100 minor_weapon_descriptions = ( +1 weapon: 2,000gp [weapon], +2 weapon: 8,000gp [weapon], Specific weapon [minor specific weapon], Special ability [minor special weapon] and roll again ) minor_weapon_descriptions[bisect_left(minor_weapon_indexes, 80)] # '+2 weapon: 8,000gp [weapon]' Compare to if 80 = 70: res = +1 weapon: 2,000gp [weapon] elif 80 = 85: res = +2 weapon: 8,000gp [weapon] elif 80 = 90: res = Specific weapon [minor specific weapon] elif 80 = 100: res = Special ability [minor special weapon] and roll again which although shorter¹ is a lot less data-driven and much less reusable. ¹ Longer if you ignore the import and class declaration. -- https://mail.python.org/mailman/listinfo/python-list
Re: 'isimmutable' and 'ImmutableNester'
On Monday, November 11, 2013 3:47:45 PM UTC-5, Frank-Rene Schäfer wrote: I prepared a PEP and was wondering what your thoughts are about it: The best place to discuss proposals for changes to the Python language and library is the Python-Ideas mailing list: https://mail.python.org/mailman/listinfo/python-ideas There you will get in-depth discussion about the details of your proposal. Fair warning: it's very unlikely that your proposal will be adopted (most are not), but you will learn a lot about how Python works in the process. :) --Ned. -- https://mail.python.org/mailman/listinfo/python-list
Re: 'isimmutable' and 'ImmutableNester'
A built-in function 'isimmutable()' shall tell efficiently whether the object of concern is mutable or not. What's the benefit over attempting to hash() the object? copy.deepcopy already has special case for int, string, and tuples (including tuples that do and do not have mutable members) - could what you need be accomplished by overriding __copy__ and __deepcopy__ in your custom class to return itself if it is immutable? -- https://mail.python.org/mailman/listinfo/python-list
UTF-32 decoder optimization in Python 3.4
From http://docs.python.org/dev/whatsnew/3.4.html#optimizations The UTF-32 decoder is now 3x to 4x faster.. Does anybody have any references to this work? All I can find is the 3.3 what's new which refers to PEP 393 (Flexible String Representation) optimizations as a result of work done by Serhiy Storchaka on issues 14624, 14738 and 15026. -- Python is the second best programming language in the world. But the best has yet to be invented. Christian Tismer Mark Lawrence -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On Tue, Nov 12, 2013 at 7:50 AM, Joshua Landau jos...@landau.ws wrote: The obvious way to me is a binary search: Which makes an O(log n) search where I have an O(1) lookup. The startup cost of denormalization doesn't scale, so when the server keeps running for two years or more, it's definitely worth processing it that way. ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On Mon, Nov 11, 2013 at 3:32 AM, Chris Angelico ros...@gmail.com wrote: On Mon, Nov 11, 2013 at 10:17 PM, Steven D'Aprano steve+comp.lang.pyt...@pearwood.info wrote: On Mon, 11 Nov 2013 21:39:27 +1100, Chris Angelico wrote: denormalizes it into a lookup table by creating 70 entries quoting the first string, 15 quoting the second, 5, and 10, respectively. Ewww :-( Imagine having to print out the dict looking for an error in the lookup table. Or imagine the case where you have: 0...2: do this 20001...890001: do that 890001...890003: do something else Don't get me wrong, it's a clever and reasonable solution for your specific use-case. But I'd much rather have a lookup table variant that matches on intervals. Of course it's Ewww in isolation :) But just imagine there are piles and piles of these tables, themselves keyed by keyword, and I want to be able to let untrusted people create tables (which means they basically have to be data, not code). Also, bear in mind, all the tables are based around dice that can be physically rolled, so none has more than 100 entries after denormalization. Quite a lot of the tables actually have unique entries per value (eg it's a d10 roll, with ten unique outputs), so it's simplest to just turn all the tables into that format; that way, the main code needs worry about one type only, and the preprocessor handles the denormalization. Hmm, I automatically think of creating a hash function, but then that's how Python implements keys in dicts, so a dict is fine solution. -- MarkJ Tacoma, Washington -- https://mail.python.org/mailman/listinfo/python-list
Creating a function for a directory
So I want to take the file, desktop/test.txt and write it to desktop/newfolder/test.txt. I tried the below script, and it gave me: IOError: [Errno 2] No such file or directory: 'desktop/%s.txt'. Any suggestions would be great. def firstdev(file): in_file = open(desktop/%s.txt) % file indata = in_file.read() out_file = open(desktop/newfolder/%s.txt, 'w') % file out_file.write(indata) out_file.close() in_file.close() firstdev(test) -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
On Mon, Nov 11, 2013 at 5:26 PM, Matt mattgrav...@gmail.com wrote: So I want to take the file, desktop/test.txt and write it to desktop/newfolder/test.txt. I tried the below script, and it gave me: IOError: [Errno 2] No such file or directory: 'desktop/%s.txt'. Any suggestions would be great. Its better in the future to cut and paste the traceback rather than paraphrase... That being said, it can't find the in_file. Maybe you aren't in the directory above desktop? Try specifying a complete path, instead of relative. Once you solve that, be sure the ouput path is specificed completely and that it exists. def firstdev(file): in_file = open(desktop/%s.txt) % file indata = in_file.read() out_file = open(desktop/newfolder/%s.txt, 'w') % file out_file.write(indata) out_file.close() in_file.close() firstdev(test) -- https://mail.python.org/mailman/listinfo/python-list -- Joel Goldstick http://joelgoldstick.com -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
On Tue, Nov 12, 2013 at 9:26 AM, Matt mattgrav...@gmail.com wrote: So I want to take the file, desktop/test.txt and write it to desktop/newfolder/test.txt. I tried the below script, and it gave me: IOError: [Errno 2] No such file or directory: 'desktop/%s.txt'. Any suggestions would be great. def firstdev(file): in_file = open(desktop/%s.txt) % file indata = in_file.read() out_file = open(desktop/newfolder/%s.txt, 'w') % file You're using the % operator, which does your interpolations, at the wrong point. You want to be adjusting the file name, not adjusting the opened file: in_file = open(desktop/%s.txt % file) out_file = open(desktop/newfolder/%s.txt % file, 'w') ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
On 11/11/2013 5:26 PM, Matt wrote: So I want to take the file, desktop/test.txt and write it to desktop/newfolder/test.txt. I tried the below script, and it gave me: IOError: [Errno 2] No such file or directory: 'desktop/%s.txt'. Any suggestions would be great. def firstdev(file): in_file = open(desktop/%s.txt) % file The problem is the above line. Rewrite is thus: in_file = open(desktop/%s.txt % file) indata = in_file.read() out_file = open(desktop/newfolder/%s.txt, 'w') % file Same here: out_file = open(desktop/newfolder/%s.txt% file, 'w') out_file.write(indata) out_file.close() in_file.close() Also don't get in the habit of reassigning built-in functions e;g; file. firstdev(test) -- Bob Gailer 919-636-4239 Chapel Hill NC -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
Sorry for incorect answer. Those guys nailed it On Nov 11, 2013 5:43 PM, bob gailer bgai...@gmail.com wrote: On 11/11/2013 5:26 PM, Matt wrote: So I want to take the file, desktop/test.txt and write it to desktop/newfolder/test.txt. I tried the below script, and it gave me: IOError: [Errno 2] No such file or directory: 'desktop/%s.txt'. Any suggestions would be great. def firstdev(file): in_file = open(desktop/%s.txt) % file The problem is the above line. Rewrite is thus: in_file = open(desktop/%s.txt % file) indata = in_file.read() out_file = open(desktop/newfolder/%s.txt, 'w') % file Same here: out_file = open(desktop/newfolder/%s.txt% file, 'w') out_file.write(indata) out_file.close() in_file.close() Also don't get in the habit of reassigning built-in functions e;g; file. firstdev(test) -- Bob Gailer 919-636-4239 Chapel Hill NC -- https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
On 11/11/2013 22:26, Matt wrote: So I want to take the file, desktop/test.txt and write it to desktop/newfolder/test.txt. I tried the below script, and it gave me: IOError: [Errno 2] No such file or directory: 'desktop/%s.txt'. Any suggestions would be great. def firstdev(file): in_file = open(desktop/%s.txt) % file in_file = open(desktop/%s.txt % file) indata = in_file.read() out_file = open(desktop/newfolder/%s.txt, 'w') % file out_file.write(indata) out_file.close() in_file.close() firstdev(test) -- Python is the second best programming language in the world. But the best has yet to be invented. Christian Tismer Mark Lawrence -- https://mail.python.org/mailman/listinfo/python-list
Re: To whoever hacked into my Database
On 11/08/2013 11:08 AM, Chris Angelico wrote: On Sat, Nov 9, 2013 at 4:11 AM, ru...@yahoo.com wrote: On 11/08/2013 03:05 AM, Νίκος Αλεξόπουλος wrote: I never ignore advices. I read all answers as carefully as i can. But nevertheless sometimes i feel things should have been better implemented using my way. Not of course that i know better, but thats better suited for me in the level iam. Most of the advice I've seen posted here has, as far as I can tell, not intended to be useful but to serve as a way to telling you are incompetent are in other ways insulting or useless. I think you are quite right to ignore it (or tell the poster to get lost.) Actually no; most of the advice has been genuine. Actually yes; most of the advice has not been genuine. Of course neither you nor I know for sure since we can't read minds. But when advice consists of things like Maybe try some of the advice you have been given instead? use php Try starting with something simple. The following is a step by step guide... Now, and this is really really going to tax you... A treatise on 1nf in six short sentences followed by ruminations on competence including ...never shows a glimmer of interest in learning. Now that helpful suggestions have been offered, and the OP continues to obstinately refuse to learn, I don't consider it helpful nor do I believe the claims of such people (who have an history of antagonistic responses) that they are genuinely trying to be helpful. If you want to be helpful try posting useful information without the insults, with an attempt to tune it to the level of understanding the recipient and without the offensive do what I tell you attitude. Long before you showed up here, I noticed the tendency to not answer questions directly but to jerk people off by giving hints or telling them to do something other than they want to do. Often that is good because the original request was for something that the OP really didn't want to do. But sometimes the OP knows they want to do (but doesn't want or is unable to clearly explain why) and when they clearly state that, yes, they do want to do it their way, their question should be answered in good faith or, for those who just can't tell how to do something wrong, ignored. I disagree. If you go to a doctor and ask for a prescription for insert name of medication, the doctor is quite right in refusing if s/he believes that that won't help you. If the OP asks for a way to stuff more into a single record in MySQL, then we're right to say No, don't do it that way. No you're not. Without determining how the data is to be used you can't say it's not normalized. Otherwise one could claim every of the millions of databases containing addresses is not even 1nf because their designers crammed two pieces of information (street number and street name) into a single datum. Second, to simply say, don't do that, it's not 1nf when most database systems provide data types like arrays, set, composites etc whose purpose is to do what you're saying not to do is not being helpful -- it's being domineering and condescending. Finally you're wrong to say no because you are not in a position to evaluate all the criteria that determines right or wrong for the OP. For example it is often easier when learning to use something one understands better, or uses less code or is simpler is some other way to the learner, with the intent to fix it later if experience shows the need. Generally, people who ask for one thing and are advised another will see that the advice is actually getting them to where they really wanted to be. There's another thread now about calling from Python into C, which I haven't been following closely, but I saw a comment from its OP to the effect of Oh right! Standard input/output would do what I want! - it may not have been specifically what was asked for, but it was helpful. If it's not helpful, give a reason for that. Right. Which is why I wrote Often that telling the OP he is doing it wrong] is good because the original request was for something that the OP really didn't want to do. I then went on to address my comments to the case where the OP insists he *does* want what he asks for. So you could have saved us all a little time by leaving out the above irrelevant paragraph. Do you (anyone) know better than all the people of this newsgroup? That you are so naive as to propose that majority opinion is always right is so naive I'm not sure what to think, other than to wonder how old you are. I would think not, firstly because you're asking the question (why are you asking if you already know better), That's pretty illogical thinking. How can he know better *before* he asks and sees the answers. Only after he gets the answers can one decide if they are better or not. and secondly because the collective knowledge and skill is far greater than any
Re: datetime question
On Friday, November 8, 2013 3:06:33 PM UTC-7, Joel Goldstick wrote: rurpy? can you help? No, sorry. For your future reference, if there is a question I can help with (have the technical knowledge, haven't seen a good answer yet, have time, etc) I will post my attempt at an answer. So lack of such a response is a pretty good clue that I can't help at the current time, and there is no need to ping me explicitly. I do appreciate your genuine concern for Nikos and that he gets a good answer though. -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
On Monday, November 11, 2013 4:26:46 PM UTC-6, Matt wrote: So I want to take the file, desktop/test.txt and write it to desktop/newfolder/test.txt. I tried the below script, and it gave me: IOError: [Errno 2] No such file or directory: 'desktop/%s.txt'. Any suggestions would be great. def firstdev(file): in_file = open(desktop/%s.txt) % file indata = in_file.read() out_file = open(desktop/newfolder/%s.txt, 'w') % file out_file.write(indata) out_file.close() in_file.close() firstdev(test) 1. i believe win32 file paths require a qualifying volume letter. 2. Never, ever, *EVER* write data to disc before confirming the paths your passing are pointing to the location you intended to write the data. Use os.path.exists(path) to test your paths BEFORE trying to write data. 3. Be sure your variables names are both self documenting and non clobbering. psst: file is a builtin! Using filename would be a far wiser choice for a variable containing a filename. When i see file, i think of a file object 4. When dealing with files you must be sure that exceptions are handled cleanly. You don't want open file objects floating aimlessly around in memory because your naive code blew chunks. 5. Remember, you cannot write a file into a directory that does not exist. 6 For OS compatibility always use os.path.join() to join path parts into a whole. This method will insert the proper separator for you depending on the OS. -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
Thank you guys so much. Brain fart moment. I appreciate it -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
On Tue, Nov 12, 2013 at 9:51 AM, Rick Johnson rantingrickjohn...@gmail.com wrote: On Monday, November 11, 2013 4:26:46 PM UTC-6, Matt wrote: So I want to take the file, desktop/test.txt and write it to desktop/newfolder/test.txt. I tried the below script, and it gave me: IOError: [Errno 2] No such file or directory: 'desktop/%s.txt'. Any suggestions would be great. def firstdev(file): in_file = open(desktop/%s.txt) % file indata = in_file.read() out_file = open(desktop/newfolder/%s.txt, 'w') % file out_file.write(indata) out_file.close() in_file.close() firstdev(test) 1. i believe win32 file paths require a qualifying volume letter. They do not; omitting the drive letter makes the path relative to the current drive (and since it doesn't start with a directory specifier, the current directory). 2. Never, ever, *EVER* write data to disc before confirming the paths your passing are pointing to the location you intended to write the data. Use os.path.exists(path) to test your paths BEFORE trying to write data. Why? Why, oh why? If there's a problem, it'll be signalled with an exception. Testing that the path exists opens you up to race problems, so you won't see anything now, but some day your code will be in a concurrent situation and you'll get unexpected exceptions. Why not just expect the exception? 3. Be sure your variables names are both self documenting and non clobbering. psst: file is a builtin! Using filename would be a far wiser choice for a variable containing a filename. When i see file, i think of a file object This one's arguable. How often do you use the 'file' builtin? I've worked with files in Python innumerable times, and I don't remember the last time I used 'file'. Yes, avoid shadowing important builtins like 'list' and 'int', but 'id' and 'file' aren't that big a deal. 4. When dealing with files you must be sure that exceptions are handled cleanly. You don't want open file objects floating aimlessly around in memory because your naive code blew chunks. They won't float around forever. The garbage collector will get to them. If you're advocating use of 'with', that's only going to be an issue if the code's called in a loop AND if it throws before the close() calls come through. 5. Remember, you cannot write a file into a directory that does not exist. So? Exception thrown, traceback printed to console, process terminated cleanly. I'm not seeing a problem here. 6 For OS compatibility always use os.path.join() to join path parts into a whole. This method will insert the proper separator for you depending on the OS. Technically true. However, most modern OSes will accept a slash. There'll be a few situations where that's not true, but the OP an happily just use slashes for simplicity. Remember the zen: Practicality beats purity. ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On Mon, Nov 11, 2013 at 5:49 PM, ru...@yahoo.com wrote: On Friday, November 8, 2013 3:06:33 PM UTC-7, Joel Goldstick wrote: rurpy? can you help? No, sorry. For your future reference, if there is a question I can help with (have the technical knowledge, haven't seen a good answer yet, have time, etc) I will post my attempt at an answer. So lack of such a response is a pretty good clue that I can't help at the current time, and there is no need to ping me explicitly. I guess the word ping can make sense as to bring attention to a particular person. I believed I responded on the mailing list. I do appreciate your genuine concern for Nikos and that he gets a good answer though. So, since you don't like to be emailed directly, (I'm guessing), I will respond here. Its nice that an occasional participant sticks up and sees the bright of side of that particular OP. My answer was an attempt at humor, specifically for you Rurpy, since after your splendid defense of the OP, he returned to the pattern of asking a question, getting a good answer, then replying with a reply like no, I want a one liner. Then, starting a new thread and asking the same question again. I don't think the idea of a mailing list or news group is to spoon feed anyone code. That is what you pay someone to do. If you want advice and guidance, its polite to try to learn from it, and move the conversation forward. have a nice day -- https://mail.python.org/mailman/listinfo/python-list -- Joel Goldstick http://joelgoldstick.com -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On 11/11/2013 19:39, Ethan Furman wrote: On 11/11/2013 11:19 AM, Denis McMahon wrote: On Mon, 11 Nov 2013 11:57:36 +0200, Νίκος Αλεξόπουλος wrote: lastvisit = ( datetime.utcnow() + timedelta(hours=2) ).strftime( '%y-%m-%d %H:%M:%S' )# MySQL datetime format Someone has an idea what to add to this line to automatically adjust itself if DST happens? Yes, but the scarcity of universal whitespace is preventing me from posting it. Boy, are you in luck! I just happen to have a whole heap of marked down ascii white-space at bargain basement prices! Is that metric or imperial whitespace? You need metric whitespace for programs written in Europe. -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On 11/11/2013 23:21, mm0fmf wrote: On 11/11/2013 19:39, Ethan Furman wrote: On 11/11/2013 11:19 AM, Denis McMahon wrote: On Mon, 11 Nov 2013 11:57:36 +0200, Νίκος Αλεξόπουλος wrote: lastvisit = ( datetime.utcnow() + timedelta(hours=2) ).strftime( '%y-%m-%d %H:%M:%S' )# MySQL datetime format Someone has an idea what to add to this line to automatically adjust itself if DST happens? Yes, but the scarcity of universal whitespace is preventing me from posting it. Boy, are you in luck! I just happen to have a whole heap of marked down ascii white-space at bargain basement prices! Is that metric or imperial whitespace? You need metric whitespace for programs written in Europe. Except for the UK, our multi-national approach means that both imperial and metric whitespace are acceptable. -- Python is the second best programming language in the world. But the best has yet to be invented. Christian Tismer Mark Lawrence -- https://mail.python.org/mailman/listinfo/python-list
Re: To whoever hacked into my Database
On Mon, Nov 11, 2013 at 5:47 PM, ru...@yahoo.com wrote: On 11/08/2013 11:08 AM, Chris Angelico wrote: On Sat, Nov 9, 2013 at 4:11 AM, ru...@yahoo.com wrote: On 11/08/2013 03:05 AM, Νίκος Αλεξόπουλος wrote: I never ignore advices. I read all answers as carefully as i can. But nevertheless sometimes i feel things should have been better implemented using my way. Not of course that i know better, but thats better suited for me in the level iam. Most of the advice I've seen posted here has, as far as I can tell, not intended to be useful but to serve as a way to telling you are incompetent are in other ways insulting or useless. I think you are quite right to ignore it (or tell the poster to get lost.) Actually no; most of the advice has been genuine. Actually yes; most of the advice has not been genuine. Of course neither you nor I know for sure since we can't read minds. But when advice consists of things like Maybe try some of the advice you have been given instead? use php It seems like you take the view that people have decided to bully or tease or laugh at this one person here. Sometimes other's ask question and they quickly get gently (maybe not gently) teased, but since I have been listening here it is one person overwhelmingly who gets this response. It doesn't mean its really the highest order behavior, but its not done in a vacuum either. Try starting with something simple. The following is a step by step guide... Now, and this is really really going to tax you... So, you don't like teasing. Why not go back and see where this teasing started. I would guess that its not from the beginning. Its only after a history that makes it appropriate (maybe not appropriate, but understandable). A treatise on 1nf in six short sentences followed by ruminations on competence including ...never shows a glimmer of interest in learning. This one I think is mine. I don't pretend to be able to write a treatise in however many sentences, let alone 6. This 'guidance' was to provide a link to a more substantial authority than me about why its a bad idea to use a database without normalizing data. If you want to get stuff out of a database with sql you have to normalize it, or know well why you would not. The thread about normalizing degenerated (sorry if the term is loaded) into people talking about various language data types that can be stored in a sql database. Blob, is the one I remember. So, if you refuse the idea that its better to build a second table with a one to many relationship to the first table rows, then you need to know how much python code will be required to reverse that 'shoving stuff' in a single column. Its a choice. Some people like writing sql, some like writing whatever. If you come here for advice, and you expect to be taken seriously, you need to come back with questions or arguments about why the advice doesn't make sense to you. The meme about the shortage of new lines is amusing, not because of the first time it came up, but because it is such a densely recurring theme. Now that helpful suggestions have been offered, and the OP continues to obstinately refuse to learn, I don't consider it helpful nor do I believe the claims of such people (who have an history of antagonistic responses) that they are genuinely trying to be helpful. What do you consider 'helpful', because in this case, people have tried the go slow approach, the here is some stuff you can read approach, the here is a 5 line piece of code that solves your problem approach. When not having fun, people in this list have put an order of magnitude more time into trying to help this OP than any other questioner, and the story always circles back. If you want to be helpful try posting useful information without the insults, with an attempt to tune it to the level of understanding the recipient and without the offensive do what I tell you attitude. Long before you showed up here, I noticed the tendency to not answer questions directly but to jerk people off by giving hints or telling them to do something other than they want to do. Often that is good because the original request was for something that the OP really didn't want to do. But sometimes the OP knows they want to do (but doesn't want or is unable to clearly explain why) and when they clearly state that, yes, they do want to do it their way, their question should be answered in good faith or, for those who just can't tell how to do something wrong, ignored. I disagree. If you go to a doctor and ask for a prescription for insert name of medication, the doctor is quite right in refusing if s/he believes that that won't help you. If the OP asks for a way to stuff more into a single record in MySQL, then we're right to say No, don't do it that way. No you're not. Without determining how the data is to be used you can't say it's not normalized. Otherwise one could claim
Re: PyWart: Python modules are not so modular after all!
On Monday, November 11, 2013 1:34:54 AM UTC-6, Steven D'Aprano wrote: import sys sys.modules[mymodule] = any_object_you_like() Thanks for this great advice! I'm not particularly fond of injecting names and objects in this manner due to the surprise factor, especially when the names are going to be global, but i'm going to do it anyway since python gives me no other choice! *evil-grin* However, there is no reason why good cannot prevail over evil. By utilizing an intelligent design, logical hierarchy, and most importantly: quality documentation and commenting to shine a light on such dark and mystical practices, i can elevate a kludge into the realms of elegance. Stay tuned for a future thread discussion on the topic... -- https://mail.python.org/mailman/listinfo/python-list
Re: To whoever hacked into my Database
On 11/11/2013 23:49, Joel Goldstick wrote: On Mon, Nov 11, 2013 at 5:47 PM, ru...@yahoo.com wrote: Lets get this right folks once and for all. Let's carry on welcoming Nikos with open arms as he's such a wonderful benefactor to the community, but ban people such as Matt who had the audacity to write about an hour ago Thank you guys so much. Brain fart moment. I appreciate it. This latter approach is simply intolerable. I'm assuming that representatives of the Python Software Foundation will be protesting to Matt in the strongest possible terms about this, and threatening him with a life long ban from this list should he repeat such disgusting words on our forum. -- Python is the second best programming language in the world. But the best has yet to be invented. Christian Tismer Mark Lawrence -- https://mail.python.org/mailman/listinfo/python-list
Re: 'isimmutable' and 'ImmutableNester'
On Mon, 11 Nov 2013 12:55:56 -0800, Ned Batchelder wrote: On Monday, November 11, 2013 3:47:45 PM UTC-5, Frank-Rene Schäfer wrote: I prepared a PEP and was wondering what your thoughts are about it: The best place to discuss proposals for changes to the Python language and library is the Python-Ideas mailing list: https://mail.python.org/mailman/listinfo/python-ideas Actually it is recommended to get at least initial feedback here first, to weed out proposals like: Python ought to allow function currying, like in Haskell. You mean like functools.partial? Oh, never mind then. -- Steven -- https://mail.python.org/mailman/listinfo/python-list
Re: 'isimmutable' and 'ImmutableNester'
On 12/11/2013 00:17, Steven D'Aprano wrote: On Mon, 11 Nov 2013 12:55:56 -0800, Ned Batchelder wrote: On Monday, November 11, 2013 3:47:45 PM UTC-5, Frank-Rene Schäfer wrote: I prepared a PEP and was wondering what your thoughts are about it: The best place to discuss proposals for changes to the Python language and library is the Python-Ideas mailing list: https://mail.python.org/mailman/listinfo/python-ideas Actually it is recommended to get at least initial feedback here first, to weed out proposals like: Python ought to allow function currying, like in Haskell. You mean like functools.partial? But I don't want to do it like that, I want... -- Python is the second best programming language in the world. But the best has yet to be invented. Christian Tismer Mark Lawrence -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
On Mon, 11 Nov 2013 14:51:45 -0800, Rick Johnson wrote: 2. Never, ever, *EVER* write data to disc before confirming the paths your passing are pointing to the location you intended to write the data. Use os.path.exists(path) to test your paths BEFORE trying to write data. This is subject to a race condition, which opens you to a security vulnerability: time of check to time of use bugs. If you follow Rick's advice, and write code like this: if os.path.exists(path): write_to(path) # custom function to open and write to the file else: handle_missing_file() your code is doubly buggy. First, os.path.exists only tells you if the path exists, not whether it is writable. Perhaps it is on read-only media, or you don't have permission to open it, or it's a directory. Secondly, even if the file exists at the moment you call os.path.exists, there is no guarantee that it will still exist a moment later when you try writing to it. Another process may delete or rename the file, or change permissions in the meantime. So you have to write: if os.path.exists(path): try: write_to(path) except (IOError, OSError): handle_missing_or_locked_file() else: handle_missing_or_locked_file() But now your test doesn't actually accomplish anything. Worse, just because the path *doesn't* exist when you check using exists, that doesn't mean it won't exist by the time you call write_to! Using os.path.exists before opening a file is, for the most part, a waste of time. -- Steven -- https://mail.python.org/mailman/listinfo/python-list
Re: To whoever hacked into my Database
On Monday, November 11, 2013 5:47:28 PM UTC-5, ru...@yahoo.com wrote: On 11/08/2013 11:08 AM, Chris Angelico wrote: On Sat, Nov 9, 2013 at 4:11 AM, ru...@yahoo.com wrote: On 11/08/2013 03:05 AM, Νίκος Αλεξόπουλος wrote: I never ignore advices. I read all answers as carefully as i can. But nevertheless sometimes i feel things should have been better implemented using my way. Not of course that i know better, but thats better suited for me in the level iam. Most of the advice I've seen posted here has, as far as I can tell, not intended to be useful but to serve as a way to telling you are incompetent are in other ways insulting or useless. I think you are quite right to ignore it (or tell the poster to get lost.) Actually no; most of the advice has been genuine. Actually yes; most of the advice has not been genuine. rurpy, I applaud your efforts to make this forum more civil. I do not like the general tone of the responses to Nikos these days. But you are being naive to present this as the big bad meanies against the innocent OP. Nikos has received a good deal of genuine advice. He has also been genuinely difficult to help. If you want to be helpful try posting useful information without the insults, with an attempt to tune it to the level of understanding the recipient and without the offensive do what I tell you attitude. Lots of people have provided useful information, tuned to the recipient. And yet the threads continue to spiral out of control. You must acknowledge that threads started by Nikos end up going badly far more often than average. It can't simply be that everyone irrationally hates Nikos. He didn't reject it out of hand, he gave some reasons why he rejected it. But as is SOP here, you chose not to see or pay any attention to those reasons. Actually, Nikos often has rejected advice out of hand. I want to do it in one line isn't a good reason to reject advice. But I don't want to make another table isn't a good criterion for database design. I like mine better than yours, it just doesn't work, can you help me fix it isn't a good way to get help. As I said, I applaud your efforts to improve the tone of this forum. But you won't do it by ignoring part of the problem: Nikos is difficult to help. He ignores advice; he doesn't seem to want to research the fundamentals of his problems; he refuses suggestions for capricious reasons; he reposts panicky questions, sometimes within minutes of each other. All of these things make him difficult to help, and raise the ire of people who are otherwise generous with their time and experience. I don't know how best to make things better overall. I know that overlooking Nikos' faults won't do it. --Ned. -- https://mail.python.org/mailman/listinfo/python-list
Stop feeding the Ferrous Cranus troll
http://www.politicsforum.org/images/flame_warriors/flame_62.php why are any of you replying? -- https://mail.python.org/mailman/listinfo/python-list
Where to handle try-except - close to the statement, or in outer loop?
Hi, I have a general question regarding try-except handling in Python. Previously, I was putting the try-handle blocks quite close to where the errors occured: A somewhat contrived example: if __name__ == __main__: my_pet = Dog('spot', 5, 'brown') my_pet.feed() my_pet.shower() and then, in each of the methods (feed(), shower()), I'd open up files, open database connections etc. And I'd wrap each statement there in it's own individual try-except block. (I'm guessing I should wrap the whole lot in a single try-except, and handle each exception there?) However, the author here: http://stackoverflow.com/a/3644618/139137 suggests that it's a bad habit to catch an exception as early as possible, and you should handle it at an outer level. From reading other posts, this seems to be the consensus as well. However, how does this work if you have multiple methods which can throw the same types of exceptions? For example, if both feed() and shower() above need to write to files, when you get your IOError, how do you distinguish where it came from? (e.g. If you wanted to print a friendly error message, saying Error writing to file while feeding., or if you otherwise wanted to handle it different). Would I wrap all of the calls in a try-except block? try: my_pet.feed() my_pet.shower() except IOError as e: # Do something to handle exception? Can anybody recommend any good examples that show current best practices for exception handling, for programs with moderate complexity? (i.e. anything more than the examples in the tutorial, basically). Cheers, Victor -- https://mail.python.org/mailman/listinfo/python-list
Re: 'isimmutable' and 'ImmutableNester'
On Tue, Nov 12, 2013 at 11:17 AM, Steven D'Aprano steve+comp.lang.pyt...@pearwood.info wrote: On Mon, 11 Nov 2013 12:55:56 -0800, Ned Batchelder wrote: On Monday, November 11, 2013 3:47:45 PM UTC-5, Frank-Rene Schäfer wrote: I prepared a PEP and was wondering what your thoughts are about it: The best place to discuss proposals for changes to the Python language and library is the Python-Ideas mailing list: https://mail.python.org/mailman/listinfo/python-ideas Actually it is recommended to get at least initial feedback here first, to weed out proposals like: Python ought to allow function currying, like in Haskell. You mean like functools.partial? Oh, never mind then. aka Guido's Time Machine situations. I think this might be one of them - I read the proposal and thought Hashability should answer that, and random832 also posted the same. Love that time machine! ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
On Tue, Nov 12, 2013 at 9:44 AM, Joel Goldstick joel.goldst...@gmail.com wrote: Sorry for incorect answer. Those guys nailed it Your answer wasn't incorrect, because it didn't give any false information. Bob and I saw the problem itself and gave advice, but you gave useful general advice on how to find the problem, which is worth bearing in mind. Matt, read Joel's response for useful tips on how to figure out what might have gone wrong. :) ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: Programa no modo gráfico
Also, we have a huge community in Brazil. If you want to write in Portuguese, you could use the official python-brasil list: https://groups.google.com/forum/#!forum/python-brasil []`s 2013/11/8 Izar Tarandach izar.tarand...@gmail.com You can find many resources for GUI programming in Python here: https://wiki.python.org/moin/GuiProgramming I believe you'll have better results with this list if you post your queries in English. --izar 2013/11/8 Guitar Men guitarmem...@gmail.com Como faço para fazer um programa no modo gráfico sem usar o prompt? -- https://mail.python.org/mailman/listinfo/python-list -- https://mail.python.org/mailman/listinfo/python-list -- Elias Granja Web and Android developer http://www.eliasgranja.com Phone: +55 19 8124-2645 -- https://mail.python.org/mailman/listinfo/python-list
Re: 'isimmutable' and 'ImmutableNester'
Hi Frank-Rene, and welcome. Comments below. On Mon, 11 Nov 2013 21:47:45 +0100, Frank-Rene Schäfer wrote: I prepared a PEP and was wondering what your thoughts are about it: PEP:pep number Title: ``isimmutable(Obj)`` and/or ``ImmutableNester`` [...] * Python-Version: 2.7.1 That won't do. Python 2.7 is in maintenance mode, it will not gain any new functionality. There won't be a Python 2.8 either. If you want to propose new functionality, it will have to go into 3.5. (You've missed the opportunity for 3.4, since feature-freeze is only weeks away.) General Idea A built-in function 'isimmutable()' shall tell efficiently whether the object of concern is mutable or not. That is it must reflect on the whole object tree whether it contains mutable elements or not. For example, in the code fragment This has been proposed before. It has failed because there is no way to tell in general whether an arbitrary object is immutable or not. If you only look at the common built-in types, it is quite trivial, e.g.: - int, str, bytes, float, frozenset, bool, None are immutable; - list, dict, set are not immutable; - tuple is immutable if all of its elements are immutable. But as soon as you allow arbitrary objects, you're in trouble. How do you tell whether an object is immutable? I recommend that you start by writing a reference implementation: def isimmutable(obj): ... # ? Some obvious thoughts: - It is not enough to include a big list of immutable classes: # don't do this if isinstance(obj, (float, int, frozenset, ...)): return True because that list will never be complete and can become out-of-date. - You could try writing to the object (how?), and if it succeeds, you know it is mutable. But if it fails, that might just mean that you haven't tried writing to it in the correct manner. - But if the obj is mutable, you've just mutated it. That's bad. - You can try hashing the object: hash(obj) If that fails, then the object *might as well* be mutable, since you can't use it in sets or as dict keys. But if that's all isimmutable() does, why not just call hash(obj) directly? Anyway, I recommend you spend some time on this exercise. The PEP will not be accepted without a reference implementation, so you're going to have to do it at some point. Another thing which your proto-PEP fails to cover in sufficient detail is why you think such a function and/all class would be useful. You do say this: If an object is immutable then copying of it can be safely be replaced by a setting of a reference. The principal scenario is when an instance A gives an instance B access to some data D under the provision that B does not change it. Therefore, B must either clone the data or it must be safe to assume that the data cannot change, i.e. is immutable. but I really don't think much of this as the principle scenario. I don't think I've ever written code that matches this scenario. If possible, you should give a real example. If not real, at least a toy example. Either way, using code rather than just a vague description is better. If the objects are large and/or many there a significant performance impact may raise from a deepcopy or manual cloning of objects. Therefore, the ``isimmutable()`` built-in function is key for a safe implementation of reference-instead-of-copying. I don't think this is true. deepcopy (at least sometimes) will avoid making a copy if the object is immutable: py import copy py x = (10001, 20002, 30003, (40004, 50005, (60006, 70007)), 80008) py copy.copy(x) is x True py copy.deepcopy(x) is x True so what advantage does isimmutable give you? Ensuring immutability is also key for the so called 'Flyweight Design Pattern'. More details please. Ultimately, nothing knows whether an object is immutable or not better than the object itself. copy.copy and copy.deepcopy know this, and ask the object to copy itself rather than copy it from the outside. Since the object knows whether it is immutable, it knows whether or not to make a copy or just return itself. It seems to me that isimmutable() *appears* to be a useful function to have, but if you look into it in detail the apparently uses for it don't hold up. In practice, it would be almost impossible to implement (except as below) and even if you could you would never need it. Really, it seems to me that the only way to implement isimmutable would be to delegate to the object: def isimmutable(obj): return obj.__isimmutable__() This gives you: if isimmutable(obj): x = obj else: x = copy.copy(obj) function_that_might_modify(x) but that gives you no advantage at all that the simpler: function_that_might_modify(copy.copy(obj)) doesn't give. So what's the point? -- Steven -- https://mail.python.org/mailman/listinfo/python-list
Re: توقيت وموعد اذاعة مباراة الزمالك ووادى دجلة فى نهائى كأس مصر اليوم السبت 9/11/2013 والقنوات الناقلة
On 12/11/2013 6:32 AM, Tony the Tiger wrote: May your woman betray you, your son be gay, and your daughter screw pigs for a living. Now go eat some pork and choke on it, like a good little terrorist. This is completely unacceptable and has no place on this list. -- https://mail.python.org/mailman/listinfo/python-list
Re: New user's initial thoughts / criticisms of Python
On 11 November 2013 22:21, Chris Angelico ros...@gmail.com wrote: On Tue, Nov 12, 2013 at 7:50 AM, Joshua Landau jos...@landau.ws wrote: The obvious way to me is a binary search: Which makes an O(log n) search where I have an O(1) lookup. The startup cost of denormalization doesn't scale, so when the server keeps running for two years or more, it's definitely worth processing it that way. log 4 is tiny so I'd expect constant factors to be far more significant here. Then you add on the better asymptotic behaviours for large n, space wise, and the simplicity of implementation. This just seems like a premature optimisation to me, I guess. I agree that your way is faster; I just don't see a single case in which I'd care. I do see several circumstances (large or floating numbers) in which I'd probably prefer my way. Feel free to disagree, I'm not really trying to convince you. -- https://mail.python.org/mailman/listinfo/python-list
Re: Where to handle try-except - close to the statement, or in outer loop?
On Tue, Nov 12, 2013 at 12:34 PM, Victor Hooi victorh...@gmail.com wrote: Would I wrap all of the calls in a try-except block? try: my_pet.feed() my_pet.shower() except IOError as e: # Do something to handle exception? It really depends more on how you go about recovering from errors. If feeding the dog and showering the dog are completely independent, you should catch errors for them separately (probably inside feed() and shower()), but if a problem with feeding the dog stops you from showering him, then do what you have here. Catch exceptions where it makes sense to recover from the issue. Sometimes that means putting a blanket catch-all at some point (if anything goes wrong here, log the error, return an HTTP 500, and go deal with the next query), and sometimes it means not catching errors at all (any that bubble all the way up will get reported on STDERR, which is often the most useful handling anyway). ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: Getting globals of the caller, not the defining module
On 11/11/2013 7:02 AM, sg...@hotmail.co.uk wrote: (Sorry for posting through GG, I'm at work.) On Monday, November 11, 2013 11:25:42 AM UTC, Steven D'Aprano wrote: Suppose I have a function that needs access to globals: # module A.py def spam(): g = globals() # this gets globals from A introspect(g) As written, spam() only sees its own globals, i.e. those of the module in which spam is defined. But I want spam to see the globals of the caller. # module B import A A.spam() # I want spam to see globals from B I can have the caller explicitly pass the globals itself: def spam(globs=None): if globs is None: globs = globals() introspect(globs) But since spam is supposed to introspect as much information as possible, I don't really want to do that. What (if anything) are my other options? How about this? # module A.py import inspect def spam(): return inspect.stack()[1][0].f_globals In Python 3, the attribute is __globals__. In either case, it is only defined on Python coded functions, so one should be prepared for it to not exist. That possibility is real because there *are* builtins like map and filter that take function args and call them. Inspect has been modified in Py 3, but stack is still there. # module B.py import A print(A.spam() is globals()) # prints True def f(): return A.spam() # module C.py import B print(B.f() is vars(B)) # prints True I don't really know what I'm doing but I guess it won't work in alternative implementations of Python. -- Terry Jan Reedy -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On Tue, Nov 12, 2013 at 12:59 PM, Dennis Lee Bieber wlfr...@ix.netcom.com wrote: Of course, I'm spoiled... My /watch/ has a dial for UTC, along with one for 24-hour indication (one hand, range 1 to 24) Heh. Mine doesn't, so I bought myself a second watch and set it to UTC. So my left hand has local time (changes at DST breaks, changes when I travel internationally), and my right hand has UTC (never changes). ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: When I send email as HTML, why do erroneous whitespaces get introduced to the HTML source and a few chars get converted to lt; and gt; ???
On Saturday, November 9, 2013 2:29:00 AM UTC-5, dieter wrote: rich writes: Dieter, you were right!!! I broke up the string by inserting CRLF before I reached 72 chars / line. Problem solved! I have the following script that reads in an HTML file containing a table then sends it out via email with a content type of text/html. For some reason a few erroneous whitespaces get introduced to the HTML source and a few chars get converted to lt; and gt; ??? ... Contents of results.html htmlheadtitleTest Campaign Results/title/headbodypSoapUI regression testing has completed against the following: br/br/ Environment: Auto.QAbr/Build: testbr/Detailed results can be found here: http://-AUTO1..xxx/SoapUITestResults/Auto.QA-2013-6-11_22-54-50br/br//ptable border=1trthSoapUI Project (WSDL/WADL)/ththTotal/ththPass/ththFailure/ththPass Percentage/th/trtrtdacceptancePartnerEndpointWSDefinition-soapui-project.xml/tdtd7/tdtdfont color=green7/font/tdtdfont color=red0/font/tdtd100.00%/td/trtrtdAIM-Automation.xml/tdtd25/tdtdfont color=green23/font/tdtdfont color=red2/font/tdtd92.00%/td/trtrtdATM-Automation.xml/tdtd41/tdtdfont color=green ... I suggest to log the generated email (before sending) to verify whether the transformation happens in your script or somewhere during the email transport. The email transport protocol (SMTP - Simple Mail Transfer Protocol) in principle imposes quite a strict limitation on line length (72 characters, when I remember right). Your html input has much larger lines - maybe, they are broken up somewhere - at the cost of spurious whitespace. Usually, a Content-Transfer-Encoding is used to satisfy the line length limitation. If this is quoted printable, then reading the text undecoded, it may seem to have additional characters (whitespace and control characters). I have no idea what may replace and by html entity references. -- https://mail.python.org/mailman/listinfo/python-list
Re: Where to handle try-except - close to the statement, or in outer loop?
On Mon, 11 Nov 2013 17:34:21 -0800, Victor Hooi wrote: Hi, I have a general question regarding try-except handling in Python. Previously, I was putting the try-handle blocks quite close to where the errors occured: A somewhat contrived example: if __name__ == __main__: my_pet = Dog('spot', 5, 'brown') my_pet.feed() my_pet.shower() and then, in each of the methods (feed(), shower()), I'd open up files, open database connections etc. And I'd wrap each statement there in it's own individual try-except block. (I'm guessing I should wrap the whole lot in a single try-except, and handle each exception there?) Your description is ambiguous. Do you mean you have: if __name__ == __main__: try: my_pet = Dog('spot', 5, 'brown') except Whatever: pass try: my_pet.feed() except Whatever: pass try: my_pet.shower() except Whatever: pass or that each individual method has it's own try...except block? The first is certainly not good. If the call to Dog fails, you shouldn't proceed with the following lines, they certainly cannot succeed. On the other hand, if the call to my_pet.feed() fails (perhaps Spot is not hungry), then it is perfectly acceptable to ignore the exception and give Spot a bath regardless. So it depends on the circumstances. On the other hand: if __name__ == __main__: try: my_pet = Dog('spot', 5, 'brown') my_pet.feed() my_pet.shower() except Whatever: pass is too much, since an error in feeding the dog prevents you from showing the dog. However, the author here: http://stackoverflow.com/a/3644618/139137 suggests that it's a bad habit to catch an exception as early as possible, and you should handle it at an outer level. Since the poster doesn't give an actual example of this, it is hard to tell what he considers too early or too late. But in general, one should only catch exceptions that you can do something about, as soon as you can do something about it. Depending on what you can do to recover from an error, that may mean wrapping each statement in it's own try block, or (more rarely, in my experience) a whole bunch of statements. From reading other posts, this seems to be the consensus as well. However, how does this work if you have multiple methods which can throw the same types of exceptions? For example, if both feed() and shower() above need to write to files, when you get your IOError, how do you distinguish where it came from? You can't, at least not easily and/or portably. (e.g. If you wanted to print a friendly error message, saying Error writing to file while feeding., or if you otherwise wanted to handle it different). If your only reason for catching the error is to suppress the stack trace and provide a friendly (i.e. useless) error message, then don't use try...except at all. Instead, install a customer error handler: http://docs.python.org/2/library/sys.html#sys.excepthook Otherwise, you should only catch exceptions that you can do something about. That might mean retrying the operation: while True: try: dog.feed() except DogNotHungryError: time.sleep(60*60) continue break or ignoring the failure: try: dog.feed() except DogNotHungryError: pass dog.bath() or doing something else. If you can't do anything about the error, then you shouldn't catch it, and leave it to code higher up to deal with it. Can anybody recommend any good examples that show current best practices for exception handling, for programs with moderate complexity? (i.e. anything more than the examples in the tutorial, basically). Yes. Read the code in the Python standard library! Open your text editor, if possible set it to open files in read-only mode, and browse the standard library. -- Steven -- https://mail.python.org/mailman/listinfo/python-list
PyMyth: Global variables are evil... WRONG!
PyMyth: Global variables are evil... WRONG! Python's Global Hysteria: How many times have your heard or read the phrase: Global variables are evil? Well if you've been a member of the Python community, I'll bet you've heard or read it more than most other community members. In this thread, i want to get to the bottom of this whole global-phobia thing once and for all, and hopefully help you folks understand that globals are not all that bad -- when DESIGNED and USED correctly that is! The denial of the 99%: Python has globals, but we just can't admit it! The creators thought they would prevent the little PyPeople from hurting themselves by handicapping our globals in the form of module level globals. But even the module level globals can be accessed globally if the module they are contained in is imported everywhere. import glomod glomod.var # Access global.var = newValue Which leads me to the conclusion that the designers were either naive or underestimated the chutzpah of this fine community. The Power of the 1%: Most of this fear of globals can be traced back to a minority of naive coders who used globals haphazardly and were hurt by them, sarcasmand now we ALL have to suffer because future idiots need to be protected from themselves! /sarcasm Too many times I've seen idiotic uses for globals. One more atrocious example was dialog return values stored as globals so the dumb coder could eaisly restore the previous state of the dialog values between successive calls. Obviously the best solution would be for the dialog object ITSELF to store (and restore) the values when necessary, but alas, here i am again expecting people to create interfaces that are consistent and logical. *rolls-eyes* Of course we can only blame the dialog designer and not the caller for this design flaw, but the caller still has no excuse for globally storaging these values. If the caller cannot repair the mistake by extending the dialog object himself, then he can store the values within the current module or class level scope. There is no excuse for elevating this information to global scope. However, there ARE justified uses of global variables! Justifying Global Variables: Globals are justified when they are used to communicate information between scopes that otherwise were meant to be mutually exclusive. One good example would be package sub- modules. Now. Some might believe that the purity of namespaces becomes tainted if they can be violently penetrated by global variables. But again, they are falling back on gut reactions fostered from years of brain washing. Yes, globals can be bad (if misused), but for the most part they are crucial to transferring information CLEANLY between isolated namespaces But even globals themselves are not good enough UNLESS we engineer a global hierarchy! From Flat to Nested == From Tricked to Bested: One of the shortcomings of the current implementation of global variables is their inherent flat access nature. There is no hierarchy of globals, and once all the good names are taken, your screwed! But Rick, even when we use globals, we don't need that many Only if you consider the single package that represents your program, but what about the thousands of support libraries with millions of lines of code that work in the background to make your measly few thousand lines of code work? What about all the globals that they have injected? Never thought of that really Throwing out global names UNADORNED is folly. Could you imagine telephone numbers without area codes? Hmm: Am i calling Jim in Beverly Hills California??? california.beverlyhills.jim or Jim in Spokane Washington??? washington.spokane.jim You see, you need to QUALIFY these names not only to make then unique, but also so the caller will understand who he is calling. Same goes for globals. -- https://mail.python.org/mailman/listinfo/python-list
Re: UTF-32 decoder optimization in Python 3.4
On 11/11/2013 4:41 PM, Mark Lawrence wrote: From http://docs.python.org/dev/whatsnew/3.4.html#optimizations The UTF-32 decoder is now 3x to 4x faster.. Does anybody have any references to this work? All I can find is the 3.3 what's new which refers to PEP 393 (Flexible String Representation) optimizations as a result of work done by Serhiy Storchaka on issues 14624, 14738 and 15026. The second line at the top has For full details, see the changelog. where changelog links to http://docs.python.org/3.4/whatsnew/changelog.html Searching that for 'UTF-34' goes to this line Issue #14625: Rewrite the UTF-32 decoder. It is now 3x to 4x faster. Patch written by Serhiy Storchaka. where 'Issue #14625' links to http://bugs.python.org/issue14625 with full discussion. (I know that you, Mark, could have found that, but not everyone reading could.) -- Terry Jan Reedy -- https://mail.python.org/mailman/listinfo/python-list
Re: PyMyth: Global variables are evil... WRONG!
On 11/11/2013 08:06 PM, Rick Johnson wrote: Globals are justified when they are used to communicate information between scopes that otherwise were meant to be mutually exclusive. I think this is certainly the use case most people would suggest. But I think you may have missed the real reason most modern designers object to inter-module globals: The presence of such entities almost always means the code has been designed badly. Whether we're writing pristine OO code (cough, cough) or more traditional procedural stuff, information hiding is a good thing. When and where there is a need for modules (or programs, or machines, or clouds, or interstellar space ...) to share information, my view is this is better done via some sort of interface/message passing mechanism. The more things that have to be shared across modules/programs/machines/clouds/space ... the more *brittle* the end system becomes. This problem is broader than just variables, BTW. It exists anytime you share *anything* across many computational components, especially in highly parallel and/or distributed systems. For example, RPCs tend to be lousy at building high scale distributed system because they usually have a call-and-wait semantic which will fail if the caller never responds. In this case the system is sharing the semantics of *time*. As a general matter, exactly-once asynchronous messaging tends to be a better implementation model here. Just my 2 cents worth. Interesting read. Thanks for taking the time -- Tim Daneliuk tun...@tundraware.com PGP Key: http://www.tundraware.com/PGP/ -- https://mail.python.org/mailman/listinfo/python-list
Re: Where to handle try-except - close to the statement, or in outer loop?
On 11/11/2013 8:34 PM, Victor Hooi wrote: I have a general question regarding try-except handling in Python. In Python, try-except can unapologetically be used as as alternate conditional-execution control-flow construct. if condition: do something else: do something else can often be re-written try: do something except exception indicating that condition was false: so something else Some reasons for using the try_except form: 1. condition is volatile and may change between the 'if condition check and the do something performance. 2. condition is expensive to check. 3. condition is nearly always True (say = 90% of the time). Notice that 'except' is at least as close to 'try' as 'else' is to 'if'. General rule: handle exceptions as soon as you can do something useful. You can find lots of examples in the stdlib where do something is a single simple statement.*** I recommend that beginners try reading some of the stdlib code. It is not necessarily all great, but the average quality should be pretty decent. Of course, some modules are more recent than others. Previously, I was putting the try-handle blocks quite close to where the errors occured: A somewhat contrived example: if __name__ == __main__: my_pet = Dog('spot', 5, 'brown') my_pet.feed() my_pet.shower() and then, in each of the methods (feed(), shower()), I'd open up files, open database connections etc. Do use with blocks. And I'd wrap each statement there in it's own individual try-except block. (I'm guessing I should wrap the whole lot in a single try-except, and handle each exception there?) However, the author here: http://stackoverflow.com/a/3644618/139137 suggests that it's a bad habit to catch an exception as early as possible, and you should handle it at an outer level. This was a side comment in a specific context of IOErrors that he thinks are best handled later. Perhaps Bernd has seen some useless inner code try-excepts that I have not. From reading other posts, this seems to be the consensus as well. As stated above, not among the people who develop Python. However, how does this work if you have multiple methods which can throw the same types of exceptions? You have noticed the reason for the *** statement above ;-). For example, if both feed() and shower() above need to write to files, when you get your IOError, how do you distinguish where it came from? (e.g. If you wanted to print a friendly error message, saying Error writing to file while feeding., or if you otherwise wanted to handle it different). Would I wrap all of the calls in a try-except block? try: my_pet.feed() my_pet.shower() except IOError as e: # Do something to handle exception? Can anybody recommend any good examples that show current best practices for exception handling, for programs with moderate complexity? (i.e. anything more than the examples in the tutorial, basically). See comment above about stdlib modules. Pick some that interest you. -- Terry Jan Reedy -- https://mail.python.org/mailman/listinfo/python-list
Reading c struct via python
Hi - We have C code which writes following struct into berkeley db (my_db.db). struct my_info { unsigned long int i, e; int o; char *f; char *s; }; How to read this via Python? Google search gave this code --- $ cat pybsd2.py from bsddb import db fruitDB = db.DB() fruitDB.open('my_db.db', None, db.DB_BTREE, db.DB_DIRTY_READ) cursor = fruitDB.cursor() rec = cursor.first() while rec: print rec rec = cursor.next() fruitDB.close() --- While storing an entry (o=500,f=/home/laks/abcde,s=OSr,i=4668368 ,e=1) and reading it back i get $ python pybsd2.py (\x10'\x00\x00\x00\x00\x00\x00, \xf4\x01\x00\x00\xd0;G\x00\x00\x00\x00\x00\x10'\x00\x00\x00\x00\x00\x00/home/laks/abcde\x00OSr\x00) And this http://docs.python.org/2/library/bsddb.html says bdb module is removed recently. Further Searching provides modules like cpickle,ctypes,struct - not sure which is the right approach/way to proceed. Should we proceed with bdb module and find out how to retrive integer from db or use others like ctypes/(c)pickle/struct etc? Thanks for any help. Ps : If this question already answered and discussed often, please redirect me to that thread. -- Cheers, Lakshmipathi.G FOSS Programmer. www.giis.co.in -- https://mail.python.org/mailman/listinfo/python-list
Re: PyMyth: Global variables are evil... WRONG!
On Monday, November 11, 2013 8:47:09 PM UTC-6, Tim Daneliuk wrote: I think this is certainly the use case most people would suggest. But I think you may have missed the real reason most modern designers object to inter-module globals: The presence of such entities almost always means the code has been designed badly. Whether we're writing pristine OO code (cough, cough) or more traditional procedural stuff, information hiding is a good thing. Yes, and i agree. But you cannot hide everything. There will always be a need to share information. When and where there is a need for modules (or programs, or machines, or clouds, or interstellar space ...) to share information, my view is this is better done via some sort of interface/message passing mechanism. But python modules can't be interfaces because interfaces should protect internal data, prevent external forces from meddling with internal state (EXCEPT via the rules of a predefined contract), hide dirty details from the caller, and have clearly defined access points. BUT PYTHON MODULES DON'T FOLLOW THIS DESIGN PATTERN! No, Python modules can be poked, prodded, and violated by any pervert who can spell the word import. Attribute values can be reassigned and state can be externally manipulated resulting in all types of undefined behaviors -- that does not sound like an interface to me. So if python modules are importable everywhere, and mutable from everywhere, then python modules are merely addresses to a collection of global variables? And they're only interfaces superficially? So that leaves us with Python's current implementation of unofficial global variables implemented as puesdo- interfaces by module objects that are victims waiting to be violated. Interesting. IF IT WALKS LIKE A GLOBAL DUCK AND... -- https://mail.python.org/mailman/listinfo/python-list
Re: datetime question
On 2013-11-11, Mark Lawrence breamore...@yahoo.co.uk wrote: On 11/11/2013 23:21, mm0fmf wrote: On 11/11/2013 19:39, Ethan Furman wrote: On 11/11/2013 11:19 AM, Denis McMahon wrote: On Mon, 11 Nov 2013 11:57:36 +0200, ?? ?? wrote: lastvisit = ( datetime.utcnow() + timedelta(hours=2) ).strftime( '%y-%m-%d %H:%M:%S' )# MySQL datetime format Someone has an idea what to add to this line to automatically adjust itself if DST happens? Yes, but the scarcity of universal whitespace is preventing me from posting it. Boy, are you in luck! I just happen to have a whole heap of marked down ascii white-space at bargain basement prices! Is that metric or imperial whitespace? You need metric whitespace for programs written in Europe. Except for the UK, our multi-national approach means that both imperial and metric whitespace are acceptable. Don't forget that there are also some differences between American and Imperial whitespace. Since it's ASCII whitespace, you should probably assume American... -- Grant -- https://mail.python.org/mailman/listinfo/python-list
Re: PyMyth: Global variables are evil... WRONG!
On Tue, Nov 12, 2013 at 3:46 PM, Rick Johnson rantingrickjohn...@gmail.com wrote: But python modules can't be interfaces because interfaces should protect internal data, prevent external forces from meddling with internal state (EXCEPT via the rules of a predefined contract), hide dirty details from the caller, and have clearly defined access points. BUT PYTHON MODULES DON'T FOLLOW THIS DESIGN PATTERN! No, Python modules can be poked, prodded, and violated by any pervert who can spell the word import. And C++ objects can be poked by anyone who can do a pointer cast. And Java objects by anyone who notices that 'const' checks don't apply to byte-code. In fact, the only language I can think of that actually prevent[s] external forces from meddling with internal state is HQ9++, which follows the very best principles of data hiding. ChrisA -- https://mail.python.org/mailman/listinfo/python-list
Re: To whoever hacked into my Database
Ned Batchelder wrote: I don't know how best to make things better overall. I know that overlooking Nikos' faults won't do it. If everyone who reached the point where they don't think they can help any more would simply say so in a calm manner and then walk away, that would make things better overall. It wouldn't help *Nikos*, but it would prevent the discussion from degenerating into a flamefest. It takes two to spiral. -- Greg -- https://mail.python.org/mailman/listinfo/python-list
Re: Creating a function for a directory
On Monday, November 11, 2013 5:11:52 PM UTC-6, Chris Angelico wrote: On Tue, Nov 12, 2013 at 9:51 AM, Rick Johnson 1. i believe win32 file paths require a qualifying volume letter. They do not; omitting the drive letter makes the path relative to the current drive (and since it doesn't start with a directory specifier, the current directory). Hmm. Let's confirm: import os os.path.exists(C:/Windows/System32) True os.path.exists(/Windows/System32) True Yep, it's official. Implicit File Path Resolution I need to author a PyWart on this soon! 2. Never, ever, *EVER* write data to disc before confirming the paths your passing are pointing to the location you intended to write the data. Use os.path.exists(path) to test your paths BEFORE trying to write data. Why? Why, oh why? If there's a problem, it'll be signalled with an exception. Except when there's a problem that won't be signaled by an EXCEPTION, but will be signaled by EMOTIONS; like for instance removing the wrong directory or truncating the wrong file because of a typo in your source code. OPPS! :-'( Testing that the path exists opens you up to race problems, so you won't see anything now, but some day your code will be in a concurrent situation and you'll get unexpected exceptions. Why not just expect the exception? Because today i'm not facing a concurrent situation, so i'm not going to bother and protect from it. Just like i'm not facing a snake bite, so i won't bother to lug around a vial of antidote. Your attempts to discredit me via hypothetical scenarios is entertaining however. This one's arguable. How often do you use the 'file' builtin? I've worked with files in Python innumerable times, and I don't remember the last time I used 'file'. Yes, avoid shadowing important builtins like 'list' and 'int', but 'id' and 'file' aren't that big a deal. My first concern is with the OP adopting self documenting names. Shadowing file is merely ensuring that the OP knows file is a builtin. Shadowing any builtin can create very difficult bugs to track. This is the point the OP should remember. They won't float around forever. The garbage collector will get to them. That depends on how they are stored. You make too many assumptions Chris. I don't have an problems with GC's, but i'm not about to write sloppy code and assume the GC is going to swoop in and save me like a feline trapped in a tree. 5. Remember, you cannot write a file into a directory that does not exist. So? Exception thrown, traceback printed to console, process terminated cleanly. I'm not seeing a problem here. Now you're just trolling! def firstdev(file): in_file = open(desktop/%s.txt) % file indata = in_file.read() out_file = open(desktop/newfolder/%s.txt, 'w') % file Just from reading that code NO ONE could know for sure if newfolder even existed BEFORE the OP tried to open the out_file. Maybe the OP thinks that missing sub-directories are auto-created by the open function, but there's no way to know for sure, hence my comment. 6 For OS compatibility always use os.path.join() to join path parts into a whole. This method will insert the proper separator for you depending on the OS. Technically true. However, most modern OSes will accept a slash. There'll be a few situations where that's not true, but the OP an happily just use slashes for simplicity. Many a developer have lived to regret those words. PS: I thought Steven was the official devils advocate around here? Hmm. I guess everyone needs a day off. -- https://mail.python.org/mailman/listinfo/python-list
Re: Buffering of sys.stdout and sys.stderr in python3 (and documentation)
It's surprising and broken that stderr should be buffered in python3. python3 calls setvbuf(3) on stderr at startup to achieve this chuckle-headed behavior. It makes stderr line buffered if on a terminal, and fully buffered if redirected to a log file. A fully buffered stderr is a very bad idea. This change goes against the C89 and C99 standards, 40+ years of precedent, and the behavior of nearly every other current programming language. Error messages will not show up in logs on time, and may be completely lost if the process is terminated before the buffer is flushed, e.g. with SIGTERM How about fixing this? Until then, we should write this in every script: sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 0) -- https://mail.python.org/mailman/listinfo/python-list
Re: Buffering of sys.stdout and sys.stderr in python3 (and documentation)
sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 0) which unfortunately doesn't work! I guess will resort to python3 -u, although I don't want stdout to be unbuffered. -- https://mail.python.org/mailman/listinfo/python-list