From: Robert W. B. <rb...@di...> - 2001-03-27 20:37:56
|
Hi all, I've ran into a bit of confusion with the id() of characters in Jython compared with Python. Here's something similar to the code that started the confusion: ---------------------------------------------------------- S = "abc" L = ["a", "b", "c"] LoL = [L, L, L] stringtest = S[1] listtest = L[1] loltest = LoL[1] def test(obj1, obj2): if ( id(obj1) != id(obj2) ): return 0 assert(test(loltest, LoL[1])), "List-of-lists test failed" assert(test(listtest, L[1])), "List test failed" assert(test(stringtest, S[1])), "String test failed" ---------------------------------------------------------- In CPython, all passes, but in Jython, there's always an AE: String test failed. Is this expected? unavoidable? Tnx -Robert |
From: D-Man <ds...@ri...> - 2001-03-27 20:53:07
|
On Tue, Mar 27, 2001 at 02:37:15PM -0600, Robert W. Bill wrote: | | I've ran into a bit of confusion with the id() of characters in strings, not characters. In (CP|J)ython a character is simply a string with a length of 1. In, say, C | C++ | Java a char is different than a char* , g_string (glib) | char* , std::string (STL) | java.lang.String | Jython compared with Python. Here's something similar to the code | that started the confusion: | | ---------------------------------------------------------- | S = "abc" | stringtest = S[1] | | def test(obj1, obj2): | if ( id(obj1) != id(obj2) ): | return 0 | | assert(test(stringtest, S[1])), "String test failed" | ---------------------------------------------------------- | | In CPython, all passes, but in Jython, there's always an AE: | String test failed. Is this expected? unavoidable? I recall hearing that CPython "interns" short strings. From my understanding, this basically means that it caches the string object and uses it for every time that string is used. There is no guarantee that any particular string will be interned, it could be an entirely new object. It seems that Jython doesn't intern the strings, so they are new objects. They should compare as being equal, even though they are different objects. This is just an implementation detail, and CPython optimizes it more than Jython. -D |
From: Jim A. <ji...@tr...> - 2001-03-28 04:20:47
|
"Robert W. Bill" wrote: > > Hi all, > > I've ran into a bit of confusion with the id() of characters in > Jython compared with Python. Here's something similar to the code > that started the confusion: > > ---------------------------------------------------------- > S = "abc" > L = ["a", "b", "c"] > LoL = [L, L, L] > stringtest = S[1] > listtest = L[1] > loltest = LoL[1] > > def test(obj1, obj2): > if ( id(obj1) != id(obj2) ): > return 0 > > assert(test(loltest, LoL[1])), "List-of-lists test failed" > assert(test(listtest, L[1])), "List test failed" > assert(test(stringtest, S[1])), "String test failed" > ---------------------------------------------------------- > > In CPython, all passes, but in Jython, there's always an AE: > String test failed. Is this expected? unavoidable? When I cut/paste this code directly into a file and run it, it fails on the first line. Doesn't the 'test' need a 'else' part? I'm new to Python but using Jython in a new project so correct me if I'm wrong... I used this instead: def test(obj1, obj2): if ( id(obj1) != id(obj2) ): return 0 else: return 1 And my version (2.1a1) passes ALL the tests. Am I missing something? -- __o Jim Adrig _ \<,_ ji...@tr... ' `/ ' ` ___________ `-' `-' |
From: Robert W. B. <rb...@di...> - 2001-03-28 15:06:00
|
On Tue, 27 Mar 2001, Jim Adrig wrote: > "Robert W. Bill" wrote: > > > > Hi all, > > > > I've ran into a bit of confusion with the id() of characters in > > Jython compared with Python. Here's something similar to the code > > that started the confusion: > > > > ---------------------------------------------------------- > > S = "abc" > > L = ["a", "b", "c"] > > LoL = [L, L, L] > > stringtest = S[1] > > listtest = L[1] > > loltest = LoL[1] > > > > def test(obj1, obj2): > > if ( id(obj1) != id(obj2) ): > > return 0 > > > > assert(test(loltest, LoL[1])), "List-of-lists test failed" > > assert(test(listtest, L[1])), "List test failed" > > assert(test(stringtest, S[1])), "String test failed" > > ---------------------------------------------------------- > > > > In CPython, all passes, but in Jython, there's always an AE: > > String test failed. Is this expected? unavoidable? > > When I cut/paste this code directly into a file and run it, it fails on > the first line. Doesn't the 'test' need a 'else' part? I'm new to Python > but using Jython in a new project so correct me if I'm wrong... Yes, it does require else. No, you're definately not wrong. Sorry for the sloppiness in my post. > I used this instead: > > def test(obj1, obj2): > if ( id(obj1) != id(obj2) ): > return 0 > else: > return 1 > > And my version (2.1a1) passes ALL the tests. > > Am I missing something? No, you are not missing anything. All tests pass in 2.1a1. I had only tested 2.0. After looking further (guided by other's comments), I'm unsure if this id is supposed to be guaranteed in this situation anyway. tnx for the reply. Regards, Robert |
From: Ype K. <yk...@xs...> - 2001-03-28 19:09:49
|
Jim, Robert, >On Tue, 27 Mar 2001, Jim Adrig wrote: >> "Robert W. Bill" wrote: >> > >> > Hi all, >> > >> > I've ran into a bit of confusion with the id() of characters in >> > Jython compared with Python. Here's something similar to the code >> > that started the confusion: >> > >> > ---------------------------------------------------------- >> > S = "abc" >> > L = ["a", "b", "c"] >> > LoL = [L, L, L] >> > stringtest = S[1] >> > listtest = L[1] >> > loltest = LoL[1] >> > >> > def test(obj1, obj2): >> > if ( id(obj1) != id(obj2) ): >> > return 0 >> > > > > assert(test(loltest, LoL[1])), "List-of-lists test failed" >> > assert(test(listtest, L[1])), "List test failed" >> > assert(test(stringtest, S[1])), "String test failed" >> > ---------------------------------------------------------- >> > >> > In CPython, all passes, but in Jython, there's always an AE: >> > String test failed. Is this expected? unavoidable? >> Even in CPython the test function should always return a value that evaluates to false. The "test" function returns None in case it does not return 0. Both None and 0 evaluate to boolean false when used after if. You might try this instead: def test(obj1, obj2): return id(obj1) == id(obj2) Also the assert code is a bit strange: 'assert' is a keyword, not a function. Leaving out one pair of brackets gives: assert test(loltest, LoL[1]), "List-of-lists test failed" I don't know what should happen when it is written as above. It might give the standard behaviour, but this seems to be something for advanced language lawyers. To me it looks like a function call followed by a comma and a string. As such you should get a syntax error. However, it is probably parsed as: assert_statement: "assert" expression ["," expression] with (test(loltest, LoL[1])) as the first expression because you saw the "String test failed" error. And then the fun with the string object id's hasn't even started... Regards, Ype |
From: D-Man <ds...@ri...> - 2001-03-28 19:41:56
|
On Wed, Mar 28, 2001 at 09:21:19PM +0100, Ype Kingma wrote: | | "Robert W. Bill" wrote: | > | > assert(test(stringtest, S[1])), "String test failed" | > | | Also the assert code is a bit strange: | 'assert' is a keyword, not a function. | Leaving out one pair of brackets gives: Robert has already mentioned that his post was hasty and had several errors in it. The posted line is harder to read due to the lack of whitespace between 'assert' and '('. Anyways, just FYI, assert can take a 2-tuple as its only "argument" assert ( 0 , "Hello World" ) is equivalent to assert 0 , "Hello World" It is quite useful when the expression, or more often, the string is too long. By using parens to create a tuple the \ prior to the newline is not necessary. -D |
From: D-Man <ds...@ri...> - 2001-03-29 15:14:14
|
On Thu, Mar 29, 2001 at 11:49:26AM +0100, Ype Kingma wrote: | | It seems that this is an ambiguity in the language definition. | The syntax of assert (see previous post) does not allow '(' | and ')' and it does not state that the comma introduces a tuple, | but in the last paragraph of 5.2.3 (see your URL above) it states | that a comma introduces a tuple. Yes, the documentation is a bit sparse and seemingly conflicting in this aspect. | I think I won't use the parenthesized form, it might break in the | future. It might, though that could be fixed with a not too complicated sed script. It may also be a fix in the documentation instead if it is decided that a 2-tuple is a better way of describing the usage of teh statement. -D |
From: <bc...@wo...> - 2001-03-29 18:04:25
|
[assert/raise on tuples or on exprs] I can't quite find head or tail in this discussion, but I think that the conclusions are wrong. The "assert" statement allow for one or for two expresion as arguments. You are allow to make that single expresion a 2-tuple, but I bet that it doesn't do what you wanted it to do: Jython 2.1a1 on java1.3.0 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> assert 1 >>> assert 0 Traceback (innermost last): File "<console>", line 1, in ? AssertionError: >>> assert 0, "message" Traceback (innermost last): File "<console>", line 1, in ? AssertionError: message >>> assert (0, "message") >>> Notice that the last assert didn't throw an AssertionError and it never will. I'll also like to set straight that there are IMO *not* any conflict in the grammar or language def about the optional comma in the assert statement and the tuple creating comma in the atom production. regards, finn |
From: <bc...@wo...> - 2001-03-29 18:42:32
|
I forgot about the raise statement. Here there are a difference between CPython and Jython. In Cpython, the first argument (the type) can be tuple and CPython will then unpack the first value of the tuple as the type and it will unpack like this repeatedly. Python 2.1b2 (#12, Mar 23 2001, 14:01:30) [MSC 32 bit (Intel)] on win32 Type "copyright", "credits" or "license" for more information. >>> raise (((IndexError, 45), 1), 3), 56 Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: 56 >>> This tuple unpacking isn't done by Jython where the entire first expression is used as the exception type: Jython 2.1a1 on java1.3.0 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> raise (((IndexError, 45), 1), 3), 56 Traceback (innermost last): File "<console>", line 1, in ? (((<class exceptions.IndexError at 5352464>, 45), 1), 3): 56 >>> This is a real difference between the python implementations, but there is AFAICT no ambiguity. The raise statement expect 0, 1, 2 or 3 expressions and the expressions can *not* be replaced by a 0, 1, 2 or 3-tuple. regards, finn |
From: D-Man <ds...@ri...> - 2001-03-29 20:42:21
|
On Thu, Mar 29, 2001 at 06:01:55PM +0000, Finn Bock wrote: | [assert/raise on tuples or on exprs] | | I can't quite find head or tail in this discussion, but I think that the | conclusions are wrong. I think you got it all ;-). | The "assert" statement allow for one or for two expresion as arguments. | You are allow to make that single expresion a 2-tuple, but I bet that it | doesn't do what you wanted it to do: | ... | >>> assert 0, "message" | Traceback (innermost last): | File "<console>", line 1, in ? | AssertionError: message | >>> assert (0, "message") | >>> | | Notice that the last assert didn't throw an AssertionError and it never | will. Hmm, oops. Thanks! | I'll also like to set straight that there are IMO *not* any conflict in | the grammar or language def about the optional comma in the assert | statement and the tuple creating comma in the atom production. Given that last example, there no longer seems to be a conflict. I was mistakenly thinking that assert ( expr , "message" ) was identical to assert expr , "message" which led to the confusion with the documentation. -D |
From: Brian Z. <bri...@ya...> - 2001-03-28 19:22:03
|
Here's some info on how to setup and use jython servlet: http://jywiki.sourceforge.net/index.php?JythonServlet and http://jywiki.sourceforge.net/index.php?JythonServletImaging for another example. Notice it's a wiki [http://jywiki.sourceforge.net/index.php?WikiWikiWeb], so you're encouraged to add stuff to the site. So far, I really enjoy writing jython servlet. Excellent work from the jython-developers. Combined with XMLC from http://xmlc.enhydra.org it feels even cleaner than JSP. Let's share and promote the use of Jython Servlet! /bzhou |