Python is becoming the world’s most popular programming language
economist.com
economist.com
Want to do web server development? Flask, Django, Tornado, etc... can do that. Probably not as concurrently as Go, but it'll do.
Scientific computing? Its no Matlab, but the syntax is easy and the time you lose in processing you make up for when developing.
Desktop computing? PyQT is pretty good. Electron may be faster to build with, C will be faster at runtime, but Python, even with Tkinter, is ok.
Functional programming? There are list comprehensions, map, reduce and filter. Not as good as Haskell or Lisp, but it'll do.
Python isn't the killer language for any of these really, but its good enough in almost all cases that you'll be very productive and can iterate to a good MVP quicker than with most other languages.
I've gone back to websites and tools YEARS later and the code as quick to pickup and easy to modify.
35 years of programming and I've never met a language so well integrated with my mind.
Of course Python nowadays has support for static types too.
The second is that I realized that Go is a statically typed language that is quite a lot easier to develop with than Python and other dynamic languages. It strikes a good balance between protecting you from mistakes while not making it hard to express your intent (most of the time, anyway). As I advance and become more concerned about my time, I find myself reaching for Go more often because the static type system has my back. I spend less time writing unit tests or iteratively running my code to make sure things still work. (People said this about Haskell and Rust and OCaml too, so I understand the skepticism dynamic language proponents have for claims like these). The deployment, dependency management, and performance stories are also quite a lot nicer in Go, and these are undervalued components of “developing velocity” as well, especially if you’re on a small team. It really changes the calculus for static vs dynamic language discussions.
I would dispute that, but I guess it depends on one's workflow. Different workflows work better with different kinds of type systems.
That's a pretty good way to put it - and mirrors my feelings. I've been programming for 20+ years (with breaks here and there), and it took a while for me to find Python. But when I found it, it's like I finally found the language that my brain thinks in.
I had written some POC scientific code for my undergrad thesis, but the thesis was sidetracked for about a year or so due to real-life issues. When I went back, I could try and test things again in just a day or two, in comparison to much more detailed documented Matlab and C code.
- There should be one-- and preferably only one --obvious way to do it.
- Simple is better than complex.
Pythons strength comes from being pretty good at scientific computing, and equally good at just about everything else.
The point that I'm trying to say is that, while we're living in a moment where python is at the center of everything, it won't last forever; it never does. Something better always shows up, given enough time.
Lots of companies successfully manage far larger Python codebases.
We have a 35M LOC Python codebase with 2500 active developers making 25000 commits per week and continuous deployment globally of new code.
(I gave a talk on it at PyData London in April: "Python at Massive Scale")
The reasoning, a gigantic code base means infrastructure and tooling investment will obviously pay off. It probably even means you get one or more dedicated resources of this sort. Whereas a small to medium sized codebase might bump into some of the same issues as a larger code base but not justify such investments.
Do you have any extra writeup to suggest?
A good next step would be reading the 2016 ACM paper "Why Google Stores Billions of Lines of Code in a Single Repository" [1] then reading a recent HN discussion [2]. That has a ton of good links.
[1] https://cacm.acm.org/magazines/2016/7/204032-why-google-stor...
- Yes, it is a monolithic application architecture. There are distinct frameworks (e.g. GUIs, DBs, distributed compute, pubsub, lazily evaluated graph, reactive graphs, etc) designed to be used together in a unified way based on a global object store.
- A 150 person platform dev team writes these core frameworks and dev tools and runs the SDLC infra.
- Then the several thousand developers in business teams build applications for their particular needs.
- When the platform team sees businesses building their own solutions to a common need, it will productionize that as a new core framework for all business to use.
- In Python terms, there is a relative small number of core classes, and very many application-specific subclasses.
What I like about Python is the ease of which you can layout a project to fit your needs. Maintaining a large codebase is more about layout/architecture than the language itself.
Maybe other languages are simply better suited for programmers who lack the need of keeping their codebase clean and tidy :)
:)
- Where is this method being used? - If I delete or change this method will anything break? ....
The main issues with large codebases are often not feature-based but rather maintenance and operational overhead related: undiscoverability, config hell, dependency hell, and scaling issues - and typing helps a little bit with one of those.
If you delete a method that has usages without searching for them, you're asking for trouble. Sure it's not a compilation error in python, but compilation can only show that the method is missing, not that changes are guaranteed to work.
If I delete a method, I automatically get a big red dot in the corner showing compilation errors (without compiling).
If I change a type from string to int in both my method and method signature, it automatically tells me every place that would break.
How do you find usages in a provable correct way in a dynamic language?
I can’t understand why developers would want to take a tool out of their tool belt like static checking.
I’m a fan of Python as a low overhead scripting language but for large systems with multiple developers, static type checking is a godsend.
How much of it is generated?
To be fair, Django is pretty good: iirc, it induces good discipline for development, which is perhaps why it is so easy to handle a large codebase.
On the other hand, the business logic is outside the scope of Django (or any other framework), and there, if the devs do not follow good practices and develop the right tools, it might be more difficult to be productive.
The way I see it, people using dynamic languages have much more freedom in development, but also less safeguards, which means that they have to build them to make their code more robust. Having code generators is a way of getting back some safety, because you only have to make sure the generators are producing correct code.
Custom code, however, need to be thoroughly tested to be considered safe, and if the compiler doesn't do any type level consistency check, it's that many more tests that needs to be written, which adds up to the LOC count.
Code generation has so many downsides and Python is so dynamic I can't think what you're doing that couldn't be done better without code generation.
The rest of my life will do fine.
I'm sure you're right, but just for fun I'll make some counter-arguments.
All technologies follow an S-curve in their 'bang for buck' life cycle. Initial improvement and return on investment ramps up slowly, then it hits a middle era where all the low hanging fruit get picked for massive returns, then it enters a third stage where most of the easy benefits have been reaped and further improvement is incremental.
We see this with the internal combustion engine, jet engines, nuclear power, all sorts of thing. Eventually another technology might come along that supplants the old technology for many or most use cases.
The question I'm pondering is, are languages technologies in this respect, or are programming languages in general a technology? If the former then Python will top out in the benefits it provides and will almost certainly be supplanted by a successor. If the latter, maybe Python is near the top of the development curve (along with many other modern languages) and further improvements will be too incremental to lead to anything supplanting it?
But if that is the case, what technology might supplant programming languages?
One possibility is visual languages that emphasize mistake proofing, interchangeable parts, and logic visualization over expressiveness. I’ve noticed an increasing number and use of visual languages (Blockly, Unreal Blueprints, NoFlo, WebGME). These are typically criticized as too limited for real programming, but seem to be climbing the S-curve.
A more likely near-term possibility is continued adoption of systems that emphasize package management, which values reuse of proven code over ability to solve problems from scratch. It seems like the language package managers are a big draw in Python & NodeJS. Maybe this trend moves even farther toward stuff like IFTT, where most people working with code are really chaining together applets.
We’re also seemingly headed toward the Star Trek TNG computer where humans query a computer with voice commands and work with it to solve problems.
My point: Likely, there is a project size where Python's dynamic nature becomes a challenge. But 10 kLoC isn't it.
[1]: https://fman.io
I'm not arguing that it's not possible to do it; I just think that it requires a bit of extra steps and care to document which assumptions your code takes and how it behaves that could be more meaningfully described by a statically typed language. But these are just my 2 cents.
[1] https://github.com/RussBaz/enforce [2] https://news.ycombinator.com/item?id=18107818
Since Python 3.5 you can use type annotations:
def my_func(foo: str, bar: User) -> None:
baz: int = User.qux
This is a useful feature for larger code bases.In the long run, I'm sure some org will come up with a decent Python compiler, that:
* compiles Python to C
* makes use of (optional) type annotations
* improves performance
* creates single file binaries
I guess this would be less of an effort than porting the whole Python ecosystem to e.g. Julia.
The ease and safety you can make huge refactors is a huge win. Sure you can do it in python, but you will be writing x10 the amount of tests and final LOC counts including tests will probably have python come in closer to Java than the 10k > 100k loc indicates
I'm not sure what you're getting at but code management in Python is really no harder than anything else. It can be clean and well delineated, or you can completely screw it up... But that's not Python's fault.
I love Python; that's the first language I've learnt and I can't really live without its REPL. I only think that the industry has a tendency to excessively obsess towards certain languages, even when they are not the best tool for the job. For instance, I strongly believe that the academia's morbid obsession with Java has crippled a whole generation of new programmers, which are now unable to think and code in no other way but the Java™ Way. I won't say that python is as bad as Java in this regard (it isn't even close), but it annoys me to death when it looks like we're heading once again towards a language monoculture; at least this time the language isn't utter crap.
Isn't that's only true for data science?
What about the JavaScript monoculture :(
And academia still has courses for C java C++ etc. No respectable University teaches a single language!
Not like it solves anything -- just that there's this side of the argument too..
> I've seen horrible stuff, such as C89 still being thought like it's the only standard available, or gets()...
Youre absolutely right -- although one could argue that the curious will have the decency to look this stuff up (like myself)
The teaching system is still pretty rekt on the python side of things. Its not like you'll find people who actually code teaching at Universities anyway :(
Like now we're just going into how bad the teaching system is. The original argument that python is reaching is a monoculture seems weird to me, when I can't even run the damn thing on a browser..
At the end any new technology trend only has only 2 - 3 years, before people flood it and dilute both quality and wages.
The education system is another mess, which no one can clean up because the education system is designed to address literacy skills at scale(quantity), not quality.
Other big problem in the Indian system is endless optimization towards exams/interviews. Go to any OJ site on the internet and you see people even from Ivy Leagues(IITs etc) and NIT's flooding the site all day doing interview related algo work instead of focussing on their day jobs.
Its not just Python, tomorrow some thing else could be famous and you can see thousands, may be even tens of thousands of people learning it in India in a few months/years. This is regardless of the merit of the technology.
People really do need to be taught how to make out buzzwords from real tech; and the major responsibility falls in the hands of universities.
Maybe it's just because most people are just trying make their way out of poverty, and this kind of work _looks_ like a sure shot, get out of slum ticket.
Maybe it's because most people are led to believe that money is the only thing that matters..
It is much easier to decouple something in a dynamic language. The re-factoring needs in a dynamic language is thus entirely different.
Also, the de-coupling and modularization of functionality has been a thing long before dynamic languages became so popular. You simply need an FFI, and then the compiler makes sure that everything is straight before you get anywhere near deployment.
I think that the real problem is not having a good test coverage, and I agree that bad programs written in Python may be harder to work with than bad programs written in a statically typed language (but in a good codebase, even if large, I'd rather be working with Python).
-- although note that in the latest incarnation of Python you can try to use Mypy (http://mypy-lang.org/) along with https://github.com/Instagram/MonkeyType or https://github.com/dropbox/pyannotate to add types to you and go from there if you really miss types too much and this could make a bad codebase bearable (I'm personally waiting for PEP 544 before adding any types though as I'm not a fan of the type system implemented in PEP 484 very much).
Refactoring in a non statically typed language cant be as straightforward - many refactors in statically typed language can be automated and guaranteed safe.
I've always found C++ much easier to work with, if not to actually write.
Refactoring a python project is usually one man's job.
Refactoring a Java project takes a whole department and process management crew.
- rename/move class (and autoupdate all references)
- change method signature
most of it is just stating what you want and the tool does it for you. I don't see that level of support from python IDEs.Sorry but you are wrong. Just plain wrong. There are benefits for both languages. But to say python is easier to refactor is like saying Java is more concise. It isn't.
>Refactoring a Java project takes a whole department and process management crew.
Has nothing to do with the language, but the company. A small company will refactor and have an update out same day in Java. An enterprise using some python will be as you say
The cool kids of the future ain't going to learn Java once companies move to a better technology. It may take decades, but eventually people will stop building new code in the language.
a) Java is a bad technology and it's not moving forward ("once companies move to a better technology")
b) new Java developers aren't being trained, including very young and bright ones, straight out of universities, and they don't enjoy Java
Both claims are false.
My previous job we had about 3 million lines of Python and it was fine.
There are efforts to have gradual typing suppprt in python though, and you might be interested in having at least partial typing suppprt.
Take dart for instance -- it doesn't require any typing as such, but has an excellent type system that supports generics too. The type checker is pretty robust, but flexible at the same time...
GNU Emacs is 1.5 million lines of LISP code, another dynamic language.
It is ultimately a question of sound software architecture. You don't have to care about how many lines of code is in the libraries you use daily or in the Operating System you use.
In similar fashion any software can be modularized so you only need to concern yourself with your part.
I, along with one other guy, maintain a >500k fortran 77 code base (bit of C/C++ sprinkled in) at work. It's way cleaner than my home-brew python. Maintainable is about wise practices, not language choice.
I can't speak for Python but since the codebases were Perl and Common Lisp based, I believe it would be similar, should there be anything similar to the MOP for Python.
Static typing is great but not essential when the program is small and you can keep the model in your head, but the larger the program, the more you benefit from static typing. Static typing helps with tiny refactorings, but it truly shines when making non-trivial changes that don't play well with the existing model; it's as effortless as making the desired changes to the model, then mindlessly fixing all compile errors, and it will likely just work afterwards.
That's the reason why they attempted writing a new runtime first (Pyston), and then settled down on rewriting their performance critical infrastructure in Go (https://blogs.dropbox.com/tech/2014/07/open-sourcing-our-go-...)
Google iself wrote grumpy for the same reason, which is that CPython scales pretty bad.
I would love for a real contender to arrive, that challenges python's level of abstraction in a real way...
Nowadays, I don't think any new, dynamically-typed language has a chance to become mainstream.
They still look kinda low level to me. Yes, they provide a lot of high-level constructs and data types like python -- But what they fail to do (IMO) is a consistent abstraction.
For example, all of these languages have a concept of pointers. All of them have a distinction between different integers (int32, int64 etc..)
I had similar feelings when I used dart or even java. They're high level, but not quite!
I don't mean to thrash on these languages in any way. I think they have some real value for programmers.
It's just that I've never seen a language just throw everything out of your way and provide you with this extremely high level and easy to reason interface.
Nim actually looked pretty good, but then I realized it was just the significant whitesapce xD
Maybe I'm too biased because Python was my first (proper) language.
Deleted comment
https://www.destroyallsoftware.com/talks/the-birth-and-death...
It's VERY real
Would love to try out something new.
typically languages like Haskell, OCaml are based on great abstractions (and are good to express new ones, especially from a type-system point of view).
If you're looking for languages which are similarly "easy to use", I can suggest to try Nim or Crystal.
Nim looks a lot like Python(indentation-based and similar constructs), it has a nice type system and very strong metaprogramming which helps to often express stuff in <= lines you would in Python (and also C and JS backends with excellent interop.
Crystal is inspired by Ruby, but it's also statically typed and mostly used for web development from my impression. Its windows support is still under development but it's also very expressive.
I realize it is weasel worded not to mean what it implies but statements like this is a surefire way to lose any credibility. Not that there was much underpinning besides some search engine popularity.
Nevertheless I'm baffled by python's popularity. With my admittedly limited exposure I would not reach for it again any time soon. When it is the right tool for the job?
> That is unlikely, according to Grady Booch, IBM’s chief software scientist, who compares programming languages to empires.
* From doing Engineering problem sets in Matlab and also using Java and C/C++ in CS classes, Java's inability to overload operators made it unbearable for anything math related.
* C/C++ wasn't bad to write small algorithms but as someone wanting to look at data, I really wasn't up for solving memory leaks.
* Then the big problem with languages like Matlab is they aren't general purpose programming languages. This meant things tooling around things like sending an email notification, creating a light web framework, etc. were limited, meanwhile, numpy's eco-system began offering many of the same benefits to the commercial data science libraries.
Whether to use it afterwards in production... it doesn't shine in the maintainable aspect (it allows for some killer one-liners close to perl level), or in the low level performance aspect, so there might be some better alternative for a particular case.
Still, Python and in particular Python 3.x is a decent compromise between hackiness and something more serious, so it's no surprise that many choose it as a starting point.
Anytime you need a simple web app.
Writing powerful CLI tools. Take a look at AWS's Python API.
Data wrangling -- it has libraries for handling so many data formats.
Quick and dirty scripts. I've used it for many one-time scripts that need a bit more than regex.
Data science / analysis -- it has so many great libraries for math and data wrangling.
The biggest pain-point I have with it is around module handling. I'll often run into issues the first time I'm deploying a new pycharm project. The second biggest pain-point I have is around concurrency/multi-threading, but I think the concurrent.futures module might provide a decent solution.
In my very bubble, it kind of already is though, not because Python is so good in and of itself, but because you can express general coding/programming ideas in a readable and concise manner. The syntax provides a general way to get your ideas across to programmers with all kinds of backgrounds and to proove they also actually work, anyone can open a shell and see for themselves and tweak and play with your idea.
That being said, it could be something much worse than Python.
oh wait :(
But my biggest problems with Python are:
- Lack of strong enough / useful / culture around typing
- Effective limitation to single core through GIL
- Lack of proper solution to closures
Really the first two are the ones that make it for me, a fundamentally crippled language. And they are exactly the things you don't notice when starting out, and the things that limit you eventually.My view is: python is great for offline tasks, like functional testing and training in machine learning - tasks that do not have huge, direct customer interaction. But to put something in production, please give me a strongly typed language with compiled binaries and no additional installations/VMs (and for me that's Go).
You meant "give me a statically typed language". Which may not actually be what you want, since statically typed languages can be, and some historically have been considered, weakly typed (C, for example).
Strong versus weak is historically poorly defined, and there's no single universally-accepted definition, but you can get the gist of it from considering the following:
a = '1'
b = 2
c = a + b
In JavaScript, the above code results in the name 'c' being bound to the string value '12'. In Python, the above code raises TypeError. Generally, "weak" typing refers to the idea that the language may coerce the values of operands to other types in order to make an operation succeed (in the above, JavaScript coerced the value of 'b' to a string and interpreted the '+' operator as asking for string concatenation, hence the result is the string '12'). "Strong" typing generally means the language won't do that, and will error out on you if you attempt an operation on values of incompatible types."Static" versus "dynamic" typing is a completely different set of terms. There's also some debate over definitions, but broadly, consider the following expression:
a = 1
In a statically-typed language, both the name 'a' and the value 1 have types, and in order to bind names to values their types must be compatible. So in the above, it's likely that both 'a' and 1 are of type int, so the assignment expression would be legal. Later attempting to bind 'a' to a value of a type incompatible with int (say, 'a = "foo"') would fail. Statically-typed languages also come with an expectation that all expressions can be checked for compatible types without needing to execute the code, and that a tool will exist to do this checking for you.In a dynamically-typed language, however, only values have types; names do not, so binding a name to a value of a particular type does not foreclose later re-binding to a value of a different type (i.e., the name 'a' might be bound to an int now, and get re-bound to a string later). This means there will be cases in a dynamically typed language where the only way to verify correctness of an expression is to execute the code (though you can usually check a high percentage without running the code).
Python is strongly typed and dynamically typed.
What's especially difficult about the following two steps?
pip install pyinstaller
pyinstaller main.pyThe core devs don't acknowledge distribution as a real issue -- which makes for a mediocre distribution experience.
Pyinstaller looks great like that, but gets extremely complex for anything serious.
Nuitka compiles your Python code to C and leaves you with a single file binary. It also improves performance.
One issue with PyInstaller is that it doesn't create a proper standalone binary. It either gives you a full directory tree or, with `--onefile`, an archive which self-extracts into such a tree.
People are often introduced first to Python by way of scripting, but the tricks and tools learned while scripting are exactly the sorts of things I've found cause dirty code. Applying clean code principles to Python is hard, because it's so easy to write dirty code, and that's a byproduct of how easy everything is to do in Python. That ever-nagging "but it's working" continues to get in the way.
It's a weird problem. I dunno what to do about it, and currently end many of my debates with colleagues on topics related to the problem without agreement.
I don't believe this is true, and I don't believe it's been true for quite some time.
First encounters with Python now tend to be via frameworks, whether for web development, machine learning, data science or automation.
For non-programmers, I think it's definitely still true that "scripting" is their primary use case for Python, and when those non-programmers shift into software development jobs because they have "3 years experience" with Python, they bring all of their bad habits with them.
https://www.economist.com/science-and-technology/2018/07/19/...
It's fascinating to see the differences between the two. The OP is a bit shorter and a bit more awkwardly worded. It also inlines some names (for instance, referring to the package manager as "an online repository" instead of "the Cheese Shop").
I wonder if the OP was written for the website (with a lower quality threshold) and the "full article" was edited/expanded-upon for the more prestigious print edition.
https://qz.com/1417145/economics-nobel-laureate-paul-romer-i...
I found the data points coarse (x = 5 years) but useful to see similar trends of popularity between C, Javascript, and Python. Note: these metrics are defined by global search engine popularity.
This is the impression I get from a few proprietary software vendors I used to work with, and those that pop up at local events in my area. I can't name one actively migrating to C/C++, C# is big if your stuck on Windows.
That being said, I have been diligently avoiding proprietary software for the last few years. My life is much happier without it, ain't got no licensing worries :D
I don't know if it's common practice, but we work like that and totally makes sense to us.
Offtopic: I disagree with grandparent, for different reasons.
> x86 ASM is the most popular language or every Python application is a c application
Python has Django though, which is light-years ahead of anything I've seen in the Node ecosystem for backend development.
Seared into my mind was a failure caused by delivering .pyc files (oops) to a server whose shared libs were compiled with different flags than our CI box.
To be fair, this was before docked (or at least before I’d heard of it). Maybe that’s improved things a bit.
Dropbox? They seem to be the company driving Python nowadays, but gave up trying to speed up Python in favour of writing "performance-sensitive code in other languages" [1].
PyPy uses a meta-tracing approach in an attempt to reduce the amount of work required. Its speed is impressive, but I'm sure meta-tracing leaves some performance on the table.
Another way to reduce the amount of work required would be to support only a subset of the language - for example, a V8 equivalent for MicroPython rather than for full Python. I'm sure this could be made very fast, but it would have very poor compatibility with existing Python code, so what would be the point?
I love python's syntax, but I could do without its lazy interpretation, without duck typing if possible, and without its reference system.
In short I just like the syntax of python, I don't really care about its modules.
[1] https://www.reddit.com/r/Python/comments/9n18ot/ive_read_abo...
I think it is a language that people should consider for beginners. Rich and helpful IDE, easy and permissible syntax (english keywords rather than symbols, case insensitive, optional parenthesis). You can do pretty much anything with it (console, desktop, website). And it provides an upgrade path to business users which only programming skills are usually toying with VBA macros.
Or does it not count because you don’t distribute binaries?
From an article that analyzes Stackoverflow's developer survey results[1]:
1. JavaScript
2. HTML
3. CSS
4. SQL
5. Java
6. Bash/Shell
7. Python
8. C#
9. PHP
10. C++
[1] https://www.businessinsider.com/14-most-popular-programming-...I doubt that's true, while it would be more true to say that most devices in the world is running something compiled from C or C++. Also, The JS environment (web or Node) is running on top of C++ code.
When I have a React or Vue or Angular problem, I don't search for "JavaScript".
Only when I need docs on JavaScript's native features, for instance Array.sort(), I include "JavaScript". And even then I may use "JS" instead, but I assume Google knows that's a synonym for "JavaScript".
While each of those searches would be part of, say, a React project, I would definitely consider that part of the JavaScript space.
To be fair, all of the above would also go for Python vs Django, etc.
I’m a big Java User mostly for Enterprise Apps & Services. A third of my code is boilerplate, Python really shine when it comes to making stuff concise but in the same way not having type is something that has always bothered me.
Dynamic typing is something I have accepted with JavaScript but for Python for some reason it has always bothered me...
https://duckduckgo.com/?q=python+strongly+typed&t=fpas&ia=qa
a = {"foo": "bar", "bar": "foo"}
b = {**a}
You can do this since 3.5
https://www.python.org/dev/peps/pep-0448/You can also do dict comprehensions which is much more expressive
b = {k: v for k,v in a.items() if v == "bar"}
This way you can copy only the parts of a dict you want in a simple one-liner. from munch import Munch
foo = {'a':1, 'b':2}
foo = Munch(foo)
print(foo.a) # 1
print(foo['a']) # 1Python is a very easy language to learn and use. In the end, ease of use always wins.
But got lost when I reached the OOP part. This speedbreaker, along with a few other distractions effectively eroded my enthusiasm for coding
Seems unlikely Python can be more popular than JavaScript/TypeScript since they are equivalent to Python and have the critical advantages of working on the web (and thus being known by all web developers) and having optimized engines in web browsers.
I do have to wonder though. Is python popular right now because so many more people who have never programmed before are now starting to program?
I came from a biology background and my hatred for matlab following one quarter of exposure was sufficient to push me to python because that was what was offered as an alternative (taught by a gradstudent rather than the guy who funded the lead dev for the Octave project). There was no other choice. Julia didn't exist etc.
In the 8 years since I have written a lot of bad code have come to very much dislike python (though I still write it daily). The reason is not because of any of the visible failings of the language. It is due to the deep hidden inconsistencies, and unexpected and unpredictable behavior of the runtime (try using list comprehension in class scope (What is class scope you ask? Well. Python is a language for newbies... so by the time you can ask this question you are too invested to realize that you might have made a bad decision)).
Python is kludge on top of kludge without the diversity of implementations to take another path when someone calls bullshit. Python can get away with it because they have runtime hacks that let you sort of do what you want, but there will be a corner case that doesn't work because there is some unspoken and undocumented assumption that you are violating and will be duly punished for.
None of this is the language's fault. It's the runtime's. The python runtime (don't even bother with discussion about the GIL, which is a red herring and a bad case of Stockholm syndrome at the same time) is a mess. The language is fine, even great. But the fact that different scopes have radically different meaning and that expressions only work in certain scopes [0] is a complete nightmare.
My main emotional interaction with python is that if I follow the BDFL approved path, everything will work. If I stray from the fascistic predetermined happy path, good luck to me, I was on the wrong side of history TM. 99% of the code that I write that doesn't start as a class I end up rewriting as a class (probably because python doesn't have closures ...). Python lures you in with promises of easy to write easy to read, but when you get to that point where your actions are no longer approved then then pain and sadness and rage are all you have left. I won't name the language that has almost the opposite interaction that I come to vastly prefer, but the emotional experience is radically different, I get extremely frustrated because I don't understand something in that language, and eventually come to realize it is because I did not understand something simple. In python I initially think that I am the one to blame, but after months or years, I finally realize that it is actually the language that is fundamentally broken and inconsistent and I have been mislead the entire time. I get frustrated because there no possible way for me to solve my problem by increasing my knowledge, I would literally have to fix a 4+ year old problem in the language (which I'm sure I couldn't do and that I'm sure has not been done for very good technical (debt) reasons), or find a library. There are a lot of libraries, but don't be fooled. Every library is a new language. Python is just the gatekeeping runtime.
Python will thrive for a large set of use cases, but when you hit a wall in python, the problem is not because you don't understand, it is because python is broken. That is not a happy realization. It is like growing up and realizing that people are actually evil, not that you were just misunderstanding them. Or more generously, that expecting people to be on their game 100% of the time is unrealistic. The difference is that python is that attractive person that is great at first impressions, but a disaster in the long term, and if I hadn't had the good fortune to meet a language that was super awkward for the first 6 months or so, but turned out to be a keeper, I'd believe that python was the only thing there is.
Python is and abusive language, and probably exists and is successful because things like perl also exist (and because it solves a whole bunch of practical problems). I'll keep using python for a long time, and the coming of age of pypy brings me great hope for the future, but there are classes of problems where I now go elsewhere. There are problems everywhere, but in some places they seem to be rational rather than contingent.
tl;dr Don't pick a language, pick a runtime.
In recent years coding has become hip/cool. I'm pretty sure none of the 10,000 Bootcamps/online courses that popped up are teaching c++ at the moment, it's all the easy stuff like Python and web. This gets people to their 'aha' moments quicker and keeps them feeling like they're progressing, even though they're doing barely any thinking. I will admit though if there is one language for anybody to learn for general purpose, it's Python.
I don't know if you'll have better luck switching after making such a large investment in Python, but if you do find something to supplant it please document your experiences for other to learn from.
I wonder, do you consider the language's awkwardness somehow related to its quality? Do you see it as a prerequisite to avoiding language shortcomings?
Someone will say 'but why not use the tack hammer?' and, at that point I argue, I am no longer using python the language, but a whole new language that happens to look like python but that has a different runtime and a different set of assumptions. This even happens inside of the core language where `[d(a) for a in b if a == c]` can be valid in some scopes but not in others. The other language does the opposite, it says "you can't do that" and so I try to hold the hammer by its head and think that it is the language that is awkward because I don't know how to use it and that there is an fact a nail gun that is configurable along every dimension from nail diameter, to nail length, to insertion speed and pressure profile over the whole insertion timecourse, it is just not there in plain sight and I the first few times I used it I accidentally nailed my feet to the ground with railroad spikes.
I guess it is more that every time I learn more about python it is about what I have to NOT do in order to be safe. In the other case I learn what TO do in order to solve the problem the way I want to. Maybe the clearest example I can think of is lambda, where you have something that looks like a lambda, but that doesn't doesn't even work like the def (): that it copies due to the biases of the language designer. Honestly it would be better if Python just removed all the syntactic features that don't have generalized runtime support because that way you don't have to know which features you can use where. Sure, there is a use case for lambda in certain contexts, but if Python refuses to support lambda as a general abstraction that I can use everywhere, then it should be removed from the language, because including it leads to those hidden inconsistencies which require an enormous memory burden on the developer just to know what is not allowed. That is dead knowledge that in no way empowers and enriches the programming experience.
In essence the push for pythonic code is not just about maintainable code, it is about keeping people on the happy path without removing delimited abstractions, which is fine, except that the explicit solution to this problem would be to have `from __i_know_what_im_doing__ import lambda, comprehensions` so that the core language didn't misleadingly offer these delimited abstractions. Of course this means that many of my favourite features would be thrown out until some core technical challenges were resolved.