views:

212

answers:

5

I've recently did some web design as a hobby with a primary motivation to learn interesting things. It was certainly nice to learn Python, but I found out there has just been a Great Python Rewrite too late, so I had to learn both Python 3 and 2.6 essentially.

I'm a newbie, so I'd like people to share what they think the strengths/weaknesses of Python 3 are from the perspective of those who do end-user programming rather than language designers. My question would be more of what people are actually liking to the point of using, or shunning as being unproductive or unpythonic.

For me, with statement is definite plus, while breaking print operator is definitely minus.

Clarification edit: there are many posts that ask whether one should learn Python 2 or 3 or whether there is any difference. I see my question is different: the feedback from people who for whatever reason made the choice of using Python 3 but might have an opinion about what works better, what not.

Another clarification: It has been pointed in the answers that with is backported to 2.*. Apologies.

+1  A: 

I think everything they did was for the best, in the long run. They removed a lot of the deprecated ways to do things, thus enforcing "There's Only One Way to Do It" and increasing consistency. Also, the with statement is awesome.

The obvious problem with using Python 3 is its lack of support for a lot of [big] libraries out there (such as Django). If none of your libraries break with Python 3, there's no reason not to use it.

musicfreak
Other than my server not having Python 3 ;)
ilya n.
+4  A: 

I'm not using Python 3 "in production", yet, but in playing around with it I've found that print being a function is a superb idea -- for example, I can easily put it in a lambda now, where in 2.* I have to use sys.stdout.write("%s\n" % foo), a bit crufty. Plus, the syntax for such tweaks as using an output file different from sys.stdout or removing the final \n is so much more readable than Python 2.*'s!

BTW, with is also in recent Python 2.* versions, it's not a Python 3 - exclusive.

Alex Martelli
I think they could do a separate pythonic printing function, like printme(). Thanks for the `with` tip!
ilya n.
Sure, we could have renamed `print`, but since removing it as a statement and keyword was crucial to the design, a less-clear name would have offered no real advantage.
Alex Martelli
I also like the consistency of having print as a function; it eliminates one point of confusion when teaching python.
Jarret Hardie
+1  A: 

I really like dictionary comprehension:

{k: v for k, v in stuff}

And extended iterable unpacking:

(head, *rest) = range(5)
Ayman Hourieh
Thanks! I missed the last one.
ilya n.
+1  A: 

This is really subjective. Python3.x is certainly an improvement over 2.x. It contains long anticipated changes like: Dictionary comprehensions, ordered dictionary, more powerful string formatting...etc Not to mention cleaner library.

Nadia Alramli
Certainly choice of language is very personal... But then languages have to evolve somehow, and that process is public by definition.
ilya n.
+2  A: 

Well a strong point is the clarification between bytes and string. How many times in your short Python experience have you been confused with the unclear UnicodeDecodeError and UnicodeEncodeError? If you never had troubles with unicode vs bytestrings, well chances are that you are using an ascii-only language, (English? ;) ) but this is usually the concept which is the hardest to grasp for beginners. (by the way, if you're still confused, this link should help for Python 2.x)

I really think that this distinction between str, and bytes, is one of the strong points of Python3.0. Read PEP358 for the formal description, and the diveintopython class for something more end-user oriented. This new feature forces developers to maintain a clear distinction between unicode objects, and bytes objects which are encoded in a specific encoding. I believe that this change will help newcomers understanding more easily the difference between the two structures, and will help experienced developers using sane programming methods.

But of course this change has its own inconvenients: porting 2.x applications is quite difficult, and these str+unicode to str+bytes change is the most annoying thing to change if you are not already clearly separating Unicode and byte strings in your 2.x code. Annoying, but long-needed.

Those breaking changes look annoying to a lot of users, and... are annoying to implement for important librairies/solutions. The current force of Python2.x is the numerous third-party applications/modules: but because it is sometimes not-trivial to port to Python3, those third-party apps will need some time to be ported (and because 2.x is still alive, those applications will need to maintain two versions: one aimed to 2.x clients, and one to 3.x... costly maintenance!) For the next year, the number of fully-fledged application running Python3 will likely be quite low, because of the low number of Python3-compatible third parties. But again, I strongly support these breaking changes: have you read this Monkey, banana, Python(3) and fire hose tale? ;)

NicDumZ
Oh, string concepts aren't a problem, though I was very surprised when conversion problems appeared in output inside Apple's Terminal. I agree Unicode is a savior, and Python 3 is cool on that, since I develop Vietnamese websites!
ilya n.
Added a link to the Monkey, banana, hose article ;)
NicDumZ
Wow, wonderful article. But I do think simple programs looked aesthetically better with non-parenthesis print statement regardless of compatibility or inertia question (of which I hope to have less since I'm a newbie).
ilya n.