[issue25919] htp.client PUT method ignores error responses sent immediatly after headers
Wiktor Niesiobedzki added the comment: Maybe something like this? Doesn't look too complicated and I haven't noticed any breakage yet. -- keywords: +patch Added file: http://bugs.python.org/file41390/http.client.put.fix.patch ___ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue25919> ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue25919] htp.client PUT method ignores error responses sent immediatly after headers
Wiktor Niesiobedzki added the comment: Here is revised patch. Also covers changes to tests. -- Added file: http://bugs.python.org/file41392/http.client.put.fix.patch ___ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue25919> ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue25919] htp.client PUT method ignores error responses sent immediatly after headers
New submission from Wiktor Niesiobedzki: It looks like, when doing PUT together with a file-like object to send, http.client will try to send the whole file before analysing the response from the server. If you do the following: $ dd if=/dev/zero of=/tmp/300mb.zero bs=1M count=300 And then run following code in Python 3.4 (tested 3.4.3 on Linux and FreeBSD): import http.client conn = http.client.HTTPSConnection('api.onedrive.com') req = conn.request( method='PUT', url='https://api.onedrive.com/v1.0/drives/me/root:/test.file:/content', body=open("/tmp/300mb.zero", "rb")) resp = conn.getresponse() You'll notice the hang. After some time, it will aborted with BrokenPipeError: [Errno 32] Broken pipe. If you run the following code within pdb debugger, and interrupt, you'll probably interrupt somewhere within write loop. You can call self.read() and see, that HTTP 413 is waiting to be interpreted. Doing similar action with curl: $ $ curl -v -T /tmp/300mb.zero https://api.onedrive.com/v1.0/drives/me/root:/test.file:/content Gives you immediate HTTP 413 error. Can we have the same behaviour in http.client library? -- components: IO messages: 256808 nosy: Wiktor Niesiobedzki priority: normal severity: normal status: open title: htp.client PUT method ignores error responses sent immediatly after headers type: behavior versions: Python 3.4 ___ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue25919> ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
Re: Loading Python 2.7
On Mon, 24 Nov 2014 18:25:25 -0500, Seymore4Head wrote: What I do when I need to run 2.7 code is to just save the file to my Python 2.7 folder and run a command prompt. I then just type the py file. That works but I am left with a dos prompt when the file finishes. I sometimes would like to be able to use the interactive shell with a 2.7 file in memory. I don't know how to do that. Don't save it to your Python27 folder. Just run command prompt in folder where your *.py file is located and type in there: py -2 -i name_of_file.py w. -- https://mail.python.org/mailman/listinfo/python-list
Re: cmd.exe on WIndows - problem with displaying some Unicode characters
On Tue, 05 Aug 2014 04:51:15 +0400, Akira Li wrote: Unicode has line drawing characters [1]. win_unicode_console [2] allows to print Unicode in cmd.exe. win_unicode_console and colorama will probably conflict. You could look at the source to see how hard to combine both functionalities. [1] http://en.wikipedia.org/wiki/Box-drawing_character [2] https://pypi.python.org/pypi/win_unicode_console btw, blessings [3] provides an easy-to-use interface if you need to add colors and move text in a terminal. It claims that it also supports colors on Windows if used with colorama. [3] https://pypi.python.org/pypi/blessings/ [2] - indeed does not work with colorconsole/colorama. And I'm not that smart to combine those two functionalities. :-) [3] - maybe it works with colorama (colorama for coloring, and blessing for positioning text), but now I don't even use colorama. I use colorconsole to color AND position text, and I find it very handy. Don't think that blessing+colorama would be more easy-to-use. Thanks, I really appreciate every proposition to fix original problem you all are giving me - I check them all. But you need to understand, that I'm already OK with those cmd.exe limitations, and really not trying to achieve look of frame from first post. I'm OK with those single-only and double-only lines. Now my game would look like this: https://dl.dropboxusercontent.com/u/10544563/kolony_prntscr.png [*] and I think it's very neat. Wiktor *) it's mocup (I don't have 'window manager' yet, so I have to show/ activate/deactivate/etc. every window by hand), but still -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: cmd.exe on WIndows - problem with displaying some Unicode characters
On 05 Aug 2014 20:26:08 GMT, Tony the Tiger wrote: On Mon, 04 Aug 2014 00:52:29 +0200, Wiktor wrote: okumenty\python\kolony\menu.py, line 14, in module This works for me on Linux: I believe you, but I use Windows and its cmd.exe (as mentioned in subject). -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: cmd.exe on WIndows - problem with displaying some Unicode characters
Hi, first, thank you all for responses. I decided to just use single line frame around menu. Yes, those double+single line corners work fine in ConEmu, but I don't want this Python script to be dependent on external program. Maybe one day it will be worth of showing to others, and it's silly to tell them 'It is pure console based game/framework but works only in ConEmu'... Now, to Terry's post: On 8/3/2014 6:52 PM, Wiktor wrote: as OO programming exercise, I'm trying to port to Python one of my favorite game from early'90 (Atari 65XL/XE) - Kolony (here's video from original version on C64 https://www.youtube.com/watch?v=UFycYOp2cbE, and here's This appears to be an actual text screen, no graphics. video from modern rewritten (for Atari emulators) version: Kolony 2106 https://www.youtube.com/watch?v=eX20Qqqm5eg - you get the idea? ;-)). This appears to be text boxes on a graphics screen. OO Design is one thing, but I want to make it look as near as possible to the original (those windows-like menus in console window). Which original? the C64 or Atari. The important characteristic of both is that both have multiple overlapping popup boxes. This means that either you or a widget framework much keep track of stacking order and how to restore what was hidden when a box goes away or is moved down in the stacking order. I would not be surprised if the Atari had at least a rudimentary widget framework. Yes, I'm aware that first link is to the text based game, and second to graphic based game. I provided both links, because I couldn't find screen cast from original Atari game (which is also text based, but IMO looks better than C64's version), and this modern game is translated to English, so is better for you to understand character of game. Yes, I'd like to make text game, that looks like window-based, with popup boxes, inactive windows grayed out and all this stuff. And all this running on standard console window (cmd.exe). I'm not starting from scratch. I'm using packages 'termcolor', 'colorama' and 'colorconsole' - they provide functions to print text at desired position on screen, and change color of foreground/background of this text. With those packages I already developed some classes that allow me to construct some simple menus for my console programs. Short demo of silly program calculating degree of n-th root: http://youtu.be/V8ilLhHAT_k (I link to the video, because there's too much code lines to paste them here. Also it's dependent upon those third party packages, and still work-in-progress). So, I'm not worry about randomly access, colors, overprinting existing characters. At this point I know how to do that. I'm taking next step, so I tried to draw nice frame around menu (that's why I posted yesterday). Next step would be to manage those widgets to draw one over another, to keep track which one window opens which, and when the other window must be closed and when only grayed out. At this point I still don't know how to do this right, but I'm thinking about this very hard. :-) Probably one day I'll ask it here, if I don't figure it out. :-) Wiktor -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: cmd.exe on WIndows - problem with displaying some Unicode characters
On Mon, 04 Aug 2014 17:43:41 +0200, Wolfgang Maier wrote: I'm not starting from scratch. I'm using packages 'termcolor', 'colorama' and 'colorconsole' - they provide functions to print text at desired position on screen, and change color of foreground/background of this text. Thanks for pointing out these packages! Since you say you're using all three of them: where do colorama and colorconsole differ. From a quick look, I can see that termcolor is a bit different, but colorama and colorconsole seem pretty similar in scope. From colorama I just use one function - init(). Without this initialization all those ansii escape characters (used by colorama itself, but also by termcolor.colored()) don't work in cmd.exe. At least I couldn't make it work. All coloring work I make in termcolor.colored() function, because it returns string, which I can work on (store and/or send it to print_at() function later). And colorconsole is helpful with its screen.print_at() function [where screen = colorconsole.terminal.get_terminal()]. So, yes, it's matter of (probably bad) design, but now I need all three packages. Maybe if I resign from storing my colored strings, and color them just while sending them to printing function, I could get rid of colorama and termcolor... Well, thanks for asking, because now, during writing this response, I see that maybe redesign is worth of trying... Wiktor -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: cmd.exe on WIndows - problem with displaying some Unicode characters
On Tue, 5 Aug 2014 03:06:41 +1000, Chris Angelico wrote: On Tue, Aug 5, 2014 at 2:48 AM, Wiktor look@signature.invalid wrote: From colorama I just use one function - init(). Without this initialization all those ansii escape characters (used by colorama itself, but also by termcolor.colored()) don't work in cmd.exe. At least I couldn't make it work. I dug into colorama's source code, and it seems that just one function is a little dismissive :) When you call colorama's init(), it replaces stdout with a wrapper that parses ANSI sequences and turns them into API calls. So, yeah, without that anything that outputs ANSI sequences isn't going to work. Maybe I didn't write it clear. :-) What I meant was, that even though I don't use any other functions from colorama (I color all the strings with termcolor) - I still have to use init() function from colorama. termcolor doesn't want to work alone, even though its described as OS independent. I guess it works fine on Linux terminal without init() function from colorama. In cmd.exe I need colorama just for this. -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: cmd.exe on WIndows - problem with displaying some Unicode characters
On Mon, 04 Aug 2014 15:17:04 -0400, Terry Reedy wrote: I'm taking next step, so I tried to draw nice frame around menu (that's why I posted yesterday). Is there no working codepage with ascii text and the line chars? I suppose I am not surprised if not. With single line (└┘┌┐─│├┤┬┴┼) and double line (╣║╗╝╚╔╩╦╠═╬) - many codepages, CP852 for sure. With corners/crosses where single and double lines meet (╖╘╡╢╕╜╛╞╟ ╧╨╤╥╙╘╒╓╫╪) - I know only one: CP437. But I can't have both - Polish letters and all those line chars, so I can't do this fancy frame from first post with Polish strings inside. There will be simpler version instead. -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
cmd.exe on WIndows - problem with displaying some Unicode characters
Hi, as OO programming exercise, I'm trying to port to Python one of my favorite game from early'90 (Atari 65XL/XE) - Kolony (here's video from original version on C64 https://www.youtube.com/watch?v=UFycYOp2cbE, and here's video from modern rewritten (for Atari emulators) version: Kolony 2106 https://www.youtube.com/watch?v=eX20Qqqm5eg - you get the idea? ;-)). OO Design is one thing, but I want to make it look as near as possible to the original (those windows-like menus in console window). I tried to use 'standard' Unicode characters (I can see that most of my Windows monospaced fonts have them) to draw frame around menu. Something like this: ┌──╖ │ Construction ║ │ Production ║ │ Research ║ │ Exploration ║ ├··╢ │ Next turn║ ╘══╝ (I like the look of double lines on right and at the bottom) But when I try to print those characters, I get an error: | Traceback (most recent call last): | File E:\Moje dokumenty\python\kolony\menu.py, line 14, in module | | File C:\Python34\lib\encodings\cp852.py, line 19, in encode | return codecs.charmap_encode(input,self.errors,encoding_map)[0] | UnicodeEncodeError: 'charmap' codec can't encode character '\u2556' in position 1 | 6: character maps to undefined Now I know what that means. Code page that my cmd.exe is using (852) doesn't have ╖, ╘, ╢ and · symbols. Changing code page to Unicode (65001) doesn't really help, because all is messed up: ┌──╖ │ Construction ║ │ Production ║ │ Research ║ │ Exploration ║ ├··╢ │ Next turn║ ╘══╝ �·╢ │ Next turn║ ╘══╝ ��╝ ��═╝ ═╝ (I believe that's cmd.exe bug with Unicode support, not Python fault) Before I drop entirely this idea of using double lines on right and bottom edges, and make it look like this ┌──┐ │ Construction │ ├--┤ │ Next turn│ └──┘ I have to ask - is there a way to make that original concept work? I know, that CP437 has symbols ╖, ╢ and ╘, but does not have polish letters - and I need to display them too. I also know, that cmd.exe can display those Unicode characters (by copy/paste them in command line or by listing filenames containing that characters), no matter what CP is set. How does it manage to do it? Can I exploit that writing my Python program? Wiktor -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: Forking PyPI package
On Thu, 29 May 2014 15:54:09 -0600, Ian Kelly wrote: On Thu, May 29, 2014 at 1:40 AM, Chris Angelico ros...@gmail.com wrote: If you absolutely can't get in touch with him, the only option is to go back to the original protocol and manually reimplement it, completely ignoring this code. It's sad but true; some code dies because of a trivial thing like Oops, I forgot to actually say that this is MIT-licensed. The second part of that is that the code should actually *include* the license text. Just writing BSD license somewhere on the website or in package metadata is annoyingly common but somewhat questionable in how a judge might interpret it. For instance, there at least four different versions of the BSD license; which one did you mean? OK, it's almost week now and I have no response from author of that script. Just like you said, there's only inscription BSD license on PYPI website, and in 'PKG-INFO' and 'setup.py' files. No 'readme.txt' or 'license.txt' is included. I can see now, that in fact it means that script isn't published under any BSD license. I guess, I'll try to do what Chris proposed. Forget about this implementation and write python script from the scratch looking only at the original JavaScript version. :-/ Thank you guys. -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: Forking PyPI package
On Fri, 6 Jun 2014 03:37:56 +1000, Chris Angelico wrote: On Fri, Jun 6, 2014 at 2:56 AM, Wiktor look@signature.invalid wrote: I guess, I'll try to do what Chris proposed. Forget about this implementation and write python script from the scratch looking only at the original JavaScript version. :-/ Sadly, that may be your only safe option. Let this be a lesson to all: If you want something to be free software, make it very clear, because it looks like he meant that to be open source just isn't enough :( Lesson taken. ;-) Interesting thing is, that for another 4 people, lack of license in this script wasn't problem to publish its modified version. I've just searched phrase pwdhash on GitHub, to simply check if someone else hadn't port this script to Python3 earlier, or maybe ported it (with proper license) to Python2 so I would have better start. And I've found practically the same script here: https://github.com/ali01/pwdhash.py, forked then 3 times. Of course I'm not going to act now Oh, they could do that without consequences, so why should I bother? - no, I'm going to do this right (as a good start in OS community) - but it feels awkward now. ;-) -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: Forking PyPI package
On Thu, 29 May 2014 02:31:56 +0200, Wiktor wrote: So, what should I do? Thanks guys, you're right. I'll contact the Lion. ;-) Yes, I forgot to mention that pwdhash.py was published under BSD licence. Without knowing that I wouldn't even consider forking it. -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Forking PyPI package
Hello. There's script pwdhash https://pypi.python.org/pypi/pwdhash.py/0.1.1, which I always* wanted to port to Python 3. (* - well, i.e. 6 months ;-)) I'm using this hashing algorithm quite often for years in my browser (Opera plugin), so I thought that it would be cool to have it as python script. It took me some time to make it work under Python 3, because I knew nothing about str - bytes encoding, and this was biggest issue why original script wasn't Py3 compatible. So now my version works, it even supports Unicode characters (original JS script does that, but pwdhash.py script doesn't), and now I'm planning to do simple GUI version, because copying from console isn't very comfortable (and I couldn't find good [os and other packages independent] solution to copy string to clipboard. Best answer from here http://goo.gl/8V9Ba6 isn't working). So, my point is, I think maybe it would be useful also to others. I'm newbie not only to Python, but to programming in general, so I don't know, what is best practice in OS programming community. How forking works. How py2-py3 porting (by 3rd person) is realized in Pythonians community. Can you suggest me something? I see few scenarios: 1) I'm trying to contact with original script's author, and send him my propositions of changes in code. (Oh, one more thing: my code isn't backward compatible, and I don't know Py2 that much to include all those try/except, so it could be Py2+Py3 compatible). He decides, if he wants to release it as Py3 only version, or combine it with his script and release Py2+Py3 common version. 2) I'm not contacting with him, and I'm forking his project on GitHub a) under the same name? - probably bad idea b) under new name (e.g. py3pwdhash)? Of course all credits about original author stay in code / setup.py. 2.1) After forking on GitHub, I'm creating new package on PyPI a) under old name, but different version number, and new description? b) under new name, to not confuse users? So, what should I do? I know, that maybe I shouldn't touch that script in first place and just mail to author Hey, would you please port it to Py3?, but I also treated it as programming exercise, and I didn't think about consequences. ;-) TIA -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: Python prime numbers
On Sat, 1 Feb 2014 07:33:47 -0800 (PST), Panagiotis Anastasiou wrote: Hi i'm new in programming and in python and i have an assignment that i cant complete. I have to Write a Python program to compute and print the first 200 prime numbers. The output must be formatted with a title and the prime numbers must be printed in 5 properly aligned columns . I have used this code so far : Hi, try out this code: for i in range(200): print '{0:5}'.format(i), if (i-4) % 5 == 0: print Or maybe, if it's still unclear, try execute these lines: print 'Hello {0}'.format('world') print '|{0:30}|'.format('right') print '|{0:30}|'.format('left') print '|{0:^30}|'.format('center') print '|{0:16}|'.format('right'), print '|{0:16}|'.format('left'), print '|{0:^16}|'.format('center') But still, it might be hard to implement this printing for..in loop while you're verifying primes (in another loop), so maybe think about getting first 200 primes in while loop like you do (and only storing them in a list), and then printing them out from this list in external for..in loop. Now, to your primetest() function. It may be good for small primes, but try to verify with it, if 832475734579 is a prime. :) def primetest(potentialprime): divisor = 2 while divisor = potentialprime: First of all, see that you rarely use this loop - you check this condition at most two times. You end up for good in the second while loop. if potentialprime == 2: return True elif potentialprime % divisor == 0: return False break 'break' after return is redundant - never executes while potentialprime % divisor != 0: if potentialprime - divisor 1: divisor += 1 else: return True So, this is your main loop. Very inefficient. Think about that: a) do you really have to check divisors up to the potentialprime? Maybe there is a point, where you may say, that you've checked all possibilities? Remember that a * b = b * a b) do you really have to check every divisor? I mean, increasing it by 1 in every step? -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') -- https://mail.python.org/mailman/listinfo/python-list
Re: [newbie] Recursive algorithm - review
On Sat, 4 Jan 2014 13:02:37 +1100, Chris Angelico wrote: def check(towers, x=None): column = [] # value added on pos. x for i in range(len(towers)): column.append(towers[i][c]) column = [x for x in column if x != 0] Any time you iterate over range(len(something)), you probably want to iterate over the thing instead: for t in towers: column.append(t[c]) Right, /facepalm/ I've done it so many times. Don't know why not this time. And any time you iterate over something and append to another list, you probably want a list comprehension: column = [t[c] for t in towers] [...] column = [t[c] for t in towers if t[c] != 0] [...] column = [t[c] for t in towers if t[c]] Nice. for c in range(len(towers)): # 'x' not provided, column = [] # so check all columns I wouldn't normally wrap a comment onto an unrelated line; I'd put the comment above the loop, since it's too long to be a part of the loop header itself. It goes as much with the else as with the loop, anyhow. My mistake. I know, that sometimes comment doesn't relate to line that is next to, but for one second I belived that it would be more readable ('talk' about the code whitout providing more unnecessary whitespace). Now I see that it isn't. This is one case where you probably _do_ want to iterate up to range(len(towers)), though, which is why I said probably above. :) for i in range(len(towers)): column.append(towers[i][c]) column = [x for x in column if x != 0] This is the same code you had above, so it can benefit from the same translation. But maybe it'd be even cleaner to simply call yourself? if not check(towers, i): return False You're right. It's cleaner this way. # print(column) if len(column) != len(set(column)): return False return True And in fact, you might want to turn this whole branch into something that harks to a more functional programming style: return all((check(towers, i) for i in range(len(towers))) Great. I didn't know all() before. :-) Now check() function looks very neat. Although 'if' statement must now looks like: 'if x is not None:'. Earlier x never was going to be 0. Now it can be. random.shuffle(row)# at every recursion Again, I wouldn't wrap comments onto unrelated lines. You see how confusing this looks, now that I take this line out of context? Same will happen if it throws an exception. Yeap. Now I see it. Never gonna do that again. :-) When you multiply a list of lists, you get references to the same list, yes. But you could use multiplication for one level: towers = [[0]*size for _ in range(size)] That'll give you independent lists. Got it! if not row: row = [a for a in range(1, size+1)] random.shuffle(row) This is the same as you have at the top of 'if not towers'. Can you be confident that row is None any time towers is None? If so, just move this up above the other check and save the duplication. row is None at start, but later it is list - sometimes an empty list. For that cases this if statement was written. If row == [] - generate new random row that I can pop out from. num = row.pop(0) # take num from right, and towers[x // size][x % size] = num # if doesn't match - put repeat = not check(towers, x) # back (append) on left - # - to rotate if repeat: # I'll repeat 'matching' next row.append(num) # number as long as last x -= 1 # changed column is unique Hmm, I'm slightly confused by your comments here. You pop(0) and append(), and describe that as taking from the right and putting on the left. Normally I'd write a list like this: Of course, of course. I was thinking one, writing another. I switched left and right in my explanation. It looks stupid now. ;-) Thank you for all Your comments. -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') # email spam trap -- https://mail.python.org/mailman/listinfo/python-list
Re: [newbie] Recursive algorithm - review
On Fri, 03 Jan 2014 20:47:16 -0500, Terry Reedy wrote: [0]*size] is fine for one row towers = [[0]*size] for i in range(size)] should do what you want for a 2-d array instead of the above. Right. Thank you also. -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') # email spam trap -- https://mail.python.org/mailman/listinfo/python-list
Re: [newbie] Recursive algorithm - review
On Sat, 4 Jan 2014 22:18:09 +1100, Chris Angelico wrote: This is the same as you have at the top of 'if not towers'. Can you be confident that row is None any time towers is None? If so, just move this up above the other check and save the duplication. row is None at start, but later it is list - sometimes an empty list. For that cases this if statement was written. If row == [] - generate new random row that I can pop out from. Yes, but will you ever pass a non-None row and a None towers? If not, you can deduplicate that bit of code by simply checking one before the other. Oh, now I understand what You mean. I rewrote that part. def generate(size=4, towers=None, row=None, x=0): if not row: row = [a for a in range(1, size+1)] random.shuffle(row) if not towers: towers = [[0]*size for _ in range(size)] towers[0] = row[:] random.shuffle(row) x = size - 1 if x + 1 size**2: # [...] Much more cleaner. Thanks! -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') # email spam trap -- https://mail.python.org/mailman/listinfo/python-list
Re: [newbie] Recursive algorithm - review
On Sat, 4 Jan 2014 22:18:09 +1100, Chris Angelico wrote: Thank you for all Your comments. My pleasure! Always happy to help out. I'm aware, that at my point of education there's no sense in optimizing code to squeeze from it every millisecond, but Project Euler gave me habit to compare time consumption of script every time I make serious change in it. Your tune-ups made this script (mostly check() I guess) about 20% faster. So it's not only 'more readable' profit. :-) -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') # email spam trap -- https://mail.python.org/mailman/listinfo/python-list
Re: [newbie] Recursive algorithm - review
On Sat, 4 Jan 2014 01:16:14 +0100, Wiktor wrote: Hi, OK, another question. This time, I think, closer to the original subject (recursive algorithm). Thanks to Terry's and Chris' advises I refined script. Then I thought, that with some changes and with minimal effort I can force this script to generate Sudoku board (again: filled out, 'solved' one). Well, I was wrong. ;-) It actually took me 2 hours to make this script working fine - even though changes weren't so big. And another one hour to make it clear enough to share here. Idea is still the same. I start with 2d array [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] And then I fill it up one number by one (exception: first row). At every step checking if current column is unique (0's not counted) and if also current segment 3x3 is unique. If that condition is True I call another instance of generate(), passing to it a) the board, b) the position in which I last putted number, and c) a list of numbers that in next step this function can choose from (if empty, function will generate new list). And so on. If that condition is False, I try another number from list of available numbers, and check again. If all numbers fail, I go back one level and try another number on previous position. I'll paste code now, and under that I'll write what's mine concern now. (if you uncomment hashed lines it will print out entire process of generating board, but watch out - it can be several thousands of lines) ### import random attempt_global = 0 def check(board, x=None, sudoku=False): global attempt_global attempt_global += 1 if sudoku and len(board) == 9 and x is not None: c = x % len(board) r = x // len(board) # print('Attempt #{}; Checking ({}x{})'.format(attempt_global, # r, c)) # for row in board: # print(row) # print() column = [t[c] for t in board if t[c]] br_min, br_max = r//3 * 3, r//3 * 3 + 3 bc_min, bc_max = c//3 * 3, c//3 * 3 + 3 block = [t[bc_min:bc_max] for t in board[br_min:br_max]] block_flat = [item for row in block for item in row if item] return len(column) == len(set(column)) and \ len(block_flat) == len(set(block_flat)) elif x is not None: c = x % len(board) column = [t[c] for t in board if t[c]] return len(column) == len(set(column)) elif sudoku and len(board) == 9: return all((check(board, i, sudoku) for i in range(0, len(board)**2, 4))) else: return all((check(board, i) for i in range(len(board def generate(size=4, board=None, row=None, x=0, sudoku=False): if not row: row = [a for a in range(1, size+1)] random.shuffle(row) if not board: board = [[0]*size for _ in range(size)] board[0] = row[:] random.shuffle(row) x = size - 1 if x + 1 size**2: repeat = True attempt = 0 while repeat: x += 1 num = row.pop(0) board[x // size][x % size] = num repeat = not check(board, x, sudoku) if repeat: row.append(num) board[x // size][x % size] = 0 x -= 1 attempt += 1 if attempt len(row) - 1: return False else: if not generate(size, board, row, x, sudoku): repeat = True row.append(num) board[x // size][x % size] = 0 x -= 1 attempt += 1 if attempt len(row) - 1: return False return board def main(): global attempt_global sudoku_board = generate(9, sudoku=True) for row in sudoku_board: print(row) print('Attempts:', attempt_global) if __name__ == __main__: main() ### OK, it works fine. Most of the time it generates board in less than 400 attempts, so not so bad. But sometimes it takes over thousand tries to generate board. For example, one time, at attempt #46 it validates last putted '1', and of course it passes, Attempt #46; Checking (4x1) [1, 5, 3, 9, 4, 2, 8, 6, 7] [2, 7, 6, 5, 8, 1, 3, 9, 4] [9, 8, 4, 7, 3, 6, 1, 5, 2] [8, 9, 5, 3, 7, 4, 6, 2, 1] [7, 1, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] then fills out entire row, and starting from attempt #61... Attempt #61; Checking (5x0) [1, 5, 3, 9, 4, 2, 8, 6, 7] [2, 7, 6, 5
Re: [newbie] Recursive algorithm - review
On Sat, 4 Jan 2014 20:07:33 +0100, Wiktor wrote: I guess that some kind of you have done this before. ;-) Damn it. This 'kind' shouldn't be there. Now it sounds silly, even offensive. ;-) Normally I would supersede it, but probably attached mailing-list doesn't recognize those Usenet articles (Chris previously answered to my superseded article). -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') # email spam trap -- https://mail.python.org/mailman/listinfo/python-list
Re: Flip a graph
On Sat, 4 Jan 2014 09:15:39 -0700, Jason Friedman wrote: My concern is whether the average 11-year-old will be able to follow such logic. Is there a better approach? Basically mine approach is the same, but maybe is easier to explain it to kids. max_height = max(measurement_dict.values()) temporary_graph = [] for t, y in measurement_dict.items(): temporary_graph.append('X'*y + ' '*(max_height - y)) for i in range(max_height-1, -1, -1): for item in temporary_graph: print(item[i], end='') print() -- Best regards, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') # email spam trap -- https://mail.python.org/mailman/listinfo/python-list
[newbie] Recursive algorithm - review
Hi, it's my first post on this newsgroup so welcome everyone. :) I'm still learning Python (v3.3), and today I had idea to design (my first) recursive function, that generates board to 'Towers' Puzzle: http://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/towers.html (so I could in future write algorithm to solve it ;-)) I'm pretty proud of myself - that it works, and that took me only 4 hours to debug. ;-) But on Project Euler site sometimes I'm also proud, that I solved some problem in 30-line script, and then on forum there's one lined solution... So maybe You might look at this script, and tell me if this can be more pythonic. It's nothing urgent. I can wait - it works after all. ;-) Idea is that function generate() 'finds' one number at a time (well, besides first row), then checks if there are no repetitions in column (because in row there cannot be by design - I pop out numbers from shuffled list [1, 2, 3, ..., size] for every row.) If no repetition - calls the same function to find next number, and so on. If there is repetition at some point - recursion jumps back, and try different number on previous position. import random def check(towers, x=None): if x: c = x % len(towers) # check only column with column = [] # value added on pos. x for i in range(len(towers)): column.append(towers[i][c]) column = [x for x in column if x != 0] # print(column) # debugging leftovers ;-) return len(column) == len(set(column)) else: for c in range(len(towers)): # 'x' not provided, column = [] # so check all columns for i in range(len(towers)): column.append(towers[i][c]) column = [x for x in column if x != 0] # print(column) if len(column) != len(set(column)): return False return True def generate(size=4, towers=None, row=None, x=0): if not towers: # executed only once. row = [a for a in range(1, size+1)]# Then I'll pass towers list random.shuffle(row)# at every recursion towers = [] # not so pretty way to generate for i in range(size): # matrix filled with 0's towers.append([]) # I tried: towers = [[0]*size]*size for j in range(size): # but this doesn't work. ;-) towers[i].append(0)# I don't know how to do this with # list comprehension (one inside row_ = row[:] # other?) towers[0] = row_# after adding first row, columns will be row = []# always unique, so I add entire row at once. x = size - 1# Then I will be adding only one num at time. # 'x' is pretty much position of last added el. if not row: row = [a for a in range(1, size+1)] random.shuffle(row) if x + 1 size**2: repeat = True attempt = 0 while repeat: # print(towers, row, x) x += 1 num = row.pop(0) # take num from right, and towers[x // size][x % size] = num # if doesn't match - put repeat = not check(towers, x) # back (append) on left - # - to rotate if repeat: # I'll repeat 'matching' next row.append(num) # number as long as last x -= 1 # changed column is unique attempt += 1 # after some attempts I give if attempt len(row) - 1: # up and jump back from return False # current recursion else: if not generate(size, towers, row, x): repeat = True row.append(num) # after some failed attempts x -= 1 # on this 'level' I give up attempt += 1 # again... if attempt len(row) - 1: return False# ...and jump back one # more time... return towers def main(): towers6by6 = generate(6) # print(check(towers6by6)) print(towers6by6) if __name__ == __main__: main() Footnote: English isn't my native language, so forgive me my bad grammar and/or vocabulary. :-) -- Best regrds, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') # spam trap -- https://mail.python.org/mailman/listinfo/python-list
[newbie] Recursive algorithm - review
Hi, it's my first post on this newsgroup so welcome everyone. :) I'm still learning Python (v3.3), and today I had idea to design (my first) recursive function, that generates (filled out) board to 'Towers' Puzzle: http://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/towers.html (so I could in future write algorithm to solve it ;-)) I'm pretty proud of myself - that it works, and that took me only 4 hours to debug. ;-) But on Project Euler site sometimes I'm also proud, that I solved some problem in 30-line script, and then on forum there's one lined solution... So maybe You might look at this script, and tell me if this can be more pythonic. It's nothing urgent. I can wait - it works after all. ;-) Idea is that function generate() 'finds' one number at a time (well, besides first row), then checks if there are no repetitions in column (because in row there cannot be by design - I pop out numbers from shuffled list [1, 2, 3, ..., size] for every row.) If no repetition - calls the same function to find next number, and so on. If there is repetition at some point - recursion jumps back, and try different number on previous position. import random def check(towers, x=None): if x: c = x % len(towers) # check only column with column = [] # value added on pos. x for i in range(len(towers)): column.append(towers[i][c]) column = [x for x in column if x != 0] # print(column) # debugging leftovers ;-) return len(column) == len(set(column)) else: for c in range(len(towers)): # 'x' not provided, column = [] # so check all columns for i in range(len(towers)): column.append(towers[i][c]) column = [x for x in column if x != 0] # print(column) if len(column) != len(set(column)): return False return True def generate(size=4, towers=None, row=None, x=0): if not towers: # executed only once. row = [a for a in range(1, size+1)]# Then I'll pass towers list random.shuffle(row)# at every recursion towers = [] # not so pretty way to generate for i in range(size): # matrix filled with 0's towers.append([]) # I tried: towers = [[0]*size]*size for j in range(size): # but this doesn't work. ;-) towers[i].append(0)# I don't know how to do this with # list comprehension (one inside row_ = row[:] # other?) towers[0] = row_# after adding first row, columns will be row = []# always unique, so I add entire row at once. x = size - 1# Then I will be adding only one num at time. # 'x' is pretty much position of last added el. if not row: row = [a for a in range(1, size+1)] random.shuffle(row) if x + 1 size**2: repeat = True attempt = 0 while repeat: # print(towers, row, x) x += 1 num = row.pop(0) # take num from right, and towers[x // size][x % size] = num # if doesn't match - put repeat = not check(towers, x) # back (append) on left - # - to rotate if repeat: # I'll repeat 'matching' next row.append(num) # number as long as last x -= 1 # changed column is unique attempt += 1 # after some attempts I give if attempt len(row) - 1: # up and jump back from return False # current recursion else: if not generate(size, towers, row, x): repeat = True row.append(num) # after some failed attempts x -= 1 # on this 'level' I give up attempt += 1 # again... if attempt len(row) - 1: return False# ...and jump back one # more time... return towers def main(): towers6by6 = generate(6) # print(check(towers6by6)) print(towers6by6) if __name__ == __main__: main() Footnote: English isn't my native language, so forgive me my bad grammar and/or vocabulary. :-) -- Best regrds, Wiktor Matuszewski 'py{}@wu{}em.pl'.format('wkm', 'ka') # spam trap -- https://mail.python.org/mailman/listinfo/python-list
PyThreadState_Swap crash
I have 2 threads in C code using python 2.5.2. First thread creates new interpreter (i need several interpreters but those 2 threads use only one) like that: PyEval_AcquireLock(); threadState = Py_NewInterpreter(); PyThreadState_Swap(threadState); // calling python API PyThreadState_Swap(NULL); PyEval_ReleaseLock(); Second thread uses interpreter created in first thread: PyEval_AcquireLock(); PyThreadState_Swap(threadState); and sometimes PyThreadState_Swap crashes in debug build (PyGILState_GetThisThreadState() returns garbage). In release build that code doesn't run and so far no other problem was found. I call PyEval_InitThreads() at the begining of program and every PyEval_AcquireLock() has PyEval_ReleaseLock(). Am I allowed to use the same threadState in different threads? If I am, is there another problem in my code? Or maybe it's a bug in python - acording to documentation Python still supports the creation of additional interpreters (using Py_NewInterpreter()), but mixing multiple interpreters and the PyGILState_*() API is unsupported. - I don't use PyGILState_ but it's used internally in PyThreadState_Swap(). I also don't use PyEval_RestoreThread() - comment sugests that crashing code is present because possibility of calling from PyEval_RestoreThread(). -- http://mail.python.org/mailman/listinfo/python-list