6 ms·
I have a whole blog post/rant brewing about that topic, but on the whole, I just think it feels like it was designed by committee rather than a visionary. They'
by Mizza 9y ago
I have a whole blog post/rant brewing about that topic, but on the whole, I just think it feels like it was designed by committee rather than a visionary. They've abandoned the common usage case in favor of the corner case. It also makes it much harder to teach.
A few quick examples:
Base64 encoding returns bytes. Why would anybody _ever_ want that? The whole purpose of B64 encoding is to make something string-safe.
It's also now invalid to have this as a project structure:
Name/name.py (with a Name class) in it.
Which I would say is literally the most sensible common project structure to have. Now you have to call the file with the name class 'core' or 'main' or anything besides the actual description of what it is. Of course, you'll get no help from the errors if you hit this problem.
"Dictionary view objects" are horribly unsemantic and annoying to teach. How is the language improved by having this no longer work `k = d.keys(); k.sort()`? Just give me a list.
I'm maintaining a fairly large and popular Python 2/3 project and all of the errors are coming from the Python 3 side, and the maintainability of the project has been decimated by needing to support both versions.
They should have just made a 2.8 with asyncio and unicode strings.
My hope is that somebody will make a new language that does to Python what Python did to C/Java. For day-to-day scripting, let's get really serious about programmer ergonomics, semantics and maintainability above all.
- goatlover 9y agoThere are other scripting languages that have good support and strong communities. There doesn't need to be yet another programming language. Use Ruby, JS or PHP 7 instead. If it's scientific computing, Julia fills the niche very nicely. Or R.
- Mizza 9y agoMy point is that we should go a level "higher" than any current offering. Ex, why not let me do something like this out of the box: get https://api.github.com/users/Miserlou as miserlou print "My name is " miserlou.name Transparent/automatic web requests, content-type checking, serialization parsing, string formatting, network reference parsing, etc. Let the user be more specific if they need to, but design heavily around the most common use case.
- goatlover 9y agoI like that! Are you sure there isn't some language that does this already?
- twic 9y agoThis is the kind of stuff Rebol wanted to do, although i don't know if it covered this particular case.
- marvy 9y agoYep, the moment I saw that I though "REBOL"! (Actually, I thought of Red, but same idea.) Still, it seems that this is not thought through properly. What should the language do if the server does not return JSON? And can't we basically do this in Python already?
- Mizza 9y agoIt's a trivial example, but the point would be that the stdlib would have the ability to a) Speak flutent HTTP b) Understand Content-Type c) Deserialize to a common format all completely transparently. If the server returned XML or MsgPack, it wouldn't matter, the code would work the same. Ideally, we could imagine this going a step further, and having the language speak REST entirely. Python's requests is a nice prototype, ergonomically speaking, but we can go much further.
- marvy 9y agoUm, what if the server returned, say, a JPEG? Or a plain old HTML webpage, complete with inline CSS and script tags?
- draegtun 9y agoThere is nothing currently built into Rebol stdlib that replicates exactly this. But here's an example of how it could be done... import <json> import <xml> load-*: function [site] [ p: open site content: read p http: query p close p parse http/headers/Content-Type [ "application/json" return (load-json content) | "application/xml" return (load-xml content) ] else [ fail "Content-Type not recognised" ] ] miserlou: load-* https://api.github.com/users/Miserlou print ["My name is" miserlou/name]
- macspoofing 9y ago>Base64 encoding returns bytes. Why would anybody _ever_ want that? What corner case do you think python 3 is solving with the return type being a byte array? Surely you must have looked into it because clearly it isn't arbitrary ... Right? >The whole purpose of B64 encoding is to make something string-safe Guess again.
- Mizza 9y agoFrom Wikipedia: "Base64 is a group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation." Binary. To. Text. As in - bytes in, text out. Come on now.
- SmirkingRevenge 9y agoIts intentional, in part because of all the mayhem caused by Python2's "free-spirited" view on whether a thing is bytes or text. And that "free-spirited" view caused A LOT of mayhem. Python3 errs on the side of not converting bytes to strings or vice versa unless its an explicit conversion on the bytes/string object itself. And it is fan-fucking-tastic!
- narimiran 9y ago> `k = d.keys(); k.sort()`? Just give me a list Here you go, a sorted list of dict keys: k = sorted(d.keys())
- Mizza 9y agoYou've completely missed the point. I'm not saying it can't be done, I'm saying that the new way is stupid. In Python 3, I have to tell my students that breakfast = ["bacon", "eggs"] sorted_breakfast = breakfast.sort() works, but breakfast = {"bacon": 2, "eggs": 3} sorted_breakfast = breakfast.keys().sort() doesn't. They will ask, "why?", and I have to say "just because." Instead, you have to use "sorted", even though "sorted" isn't even a verb, it is a property. "Why is sorted() rather than sort()" - "just because." Similarly, "where is there a b'' in front of my name", why can't it find my module, and on and on and on. The advantages of Python of a teaching languages are mostly gone now, and I would probably use JavaScript to teach beginners now, whereas I previously would have used Python2.7.
- narimiran 9y ago> In Python 3, I have to tell my students that > breakfast = ["bacon", "eggs"] > sorted_breakfast = breakfast.sort() > works Well, some of your students might point out to you that your `sorted_breakfast` is `None`, because that is what `sort()` returns, and even this example doesn't work as you have wanted ;) On the other hand, if you have used `sorted(breakfast)` (and `sorted(breakfast.keys())` in other example), both examples would work as intended, and you couldn't blame Python 3. > "Why is sorted() rather than sort()" - "just because." It is not "just because", it is because it returns a sorted list (which is exactly what you wanted), compared to returning None.
- masklinn 9y ago> It is not "just because", it is because it returns a sorted list (which is exactly what you wanted), compared to returning None. Also because `sorted()` works on any iterable, whereas .sort only works on lists.
- 9y ago
- masklinn 9y ago> Base64 encoding returns bytes. Why would anybody _ever_ want that? The whole purpose of B64 encoding is to make something string-safe. No, it's to make something ascii-safe which is a completely different concern. > It's also now invalid to have this as a project structure: Name/name.py (with a Name class) in it. What? > mkdir Name > echo "class Name: pass" > Name/name.py > python3 -c "from Name.name import Name;print(Name)" <class 'Name.name.Name'> > "Dictionary view objects" are horribly unsemantic Unsemantic? They're just the opposite. keyviews and itemviews are now sets, which is semantically sensible and really useful to get the intersection of two dictionary keysets, the only missing part is being able to subdict based on a keyset. > Just give me a list. list(d.keys()) Why are you even using .sort() > unicode strings. That's what broke compatibility FFS, that's the entire reason why the maintainers felt they could change the rest of the language.
- Volt 9y agoHow do you feel about this: https://github.com/naftaliharris/tauthon https://github.com/naftaliharris/tauthon