As to what practical use that philosophy has? Well, it is what moulds the language. You must have encountered discussions that include a phrase like "What would be the most pythonic way to do it?". The very existence of the word is indicative that there is a philosophy of Python (that encompasses everything from the design of the language to coding styles), and if anything that the existence of a philosophy of Python is more important to some people than it is to aficionados of [most*] other programming languages because someone coined the word and it gained currency.
Or you can flip that on its head and say that if a new programming language doesn't have a philosophy then what is the point of having the new language? If it does all the same things, in the same ways, as existing programming languages, just with different syntax then it brings nothing new to the table.
Ah, now I understand. As I've said before, I don't like Python because it has nice features, I like it because it has fewer/milder practical downsides than the alternatives.
Similarly, instead of an underlying philosophy as you described, I consider programming languages' based on their practical approach to problem solving and their patterns (which I call their 'programming paradigm'). In my opinion, the difference between philosophy and paradigm is analogous to the difference between models and patterns, or the difference between asking
why and
how. (Or, how there is
Unix philosophy, and then there is
POSIX – not just the extensions to the C standard library, but things like sockets, signals, timers, et cetera.)
In a perfect programming language, both would be well formed and described... but what we have at hand, especially Python, is more like a set of compromises.
Finally examining the philosophy (in the general sense) of the type systems of programming languages is in itself important in the same way that Russell examining the philosophy of mathematics was important. As you know, Russell discovered problems with, and solutions to the problems of, the very foundations of mathematics. Instinctively I feel we are in Russell territory here asking the question "In the light of these inconsistencies, is the Python type system well formed?" with, at least on my behalf, a sneaking suspicion that the answer might be "no" . Now, as I know I'm not in the least qualified to discuss Russell's logic that's where I'm going to leave it.
I understand, and definitely do not disagree. Perhaps my stance here could be summarised as
"True; but the programming languages we currently have are just practical tools full of compromises and less than optimal design choices, their philosophies full of elephant-sized holes, so I do not think analysis at that level is appropriate yet
."You're more than entitled to take that position. It's just for me that "purely practical" stepping around the issue feels rather like cleaning the floor by sweeping the dust up, and then putting it underneath the carpet. It will niggle and moreover it make me wonder "What other things might we have missed? Will they be gotchas with practical importance?". It's a bit like Gödel, Russell and the underpinnings of mathematics (perhaps with a little sprinkle of Turing), for all practical purposes it all worked before they got their hands on it, but now we how to make some bits work better, and perhaps most importantly, we now know where it can't work.
I can definitely appreciate that. To me, the situation is more like an earthen floor, sweeping of which for dust is impractical, and see concentrating on the larger debris and unwanted dirt more appropriate for now. I would love to have a proper floor (programming language with solid underpinnings), but I do not have the, uh, engineering experience in floors?, to construct one myself; so, I have resigned to work with what I have, and help develop better stuff in other, more limited scopes first. (Like
embedded C patterns or
a replacement for the C standard library. Or how to make web based services more secure by leveraging the Unix/POSIX kernel-provided privilege separation mechanisms (process user and groups) and so on, using Python (or any other scripting language) on the backend.)
(Apologies for stretching the analogy so far
.)
In systems programming, my attitude shows clearest in that I insist that whenever a program detects an error when dealing with my data, I want it to tell it to me, the user whose data that is. I care much less whether the program can deal with the error or can work around it –– that would be
nice, but much less important to me. I never trust tools like computers or computer programs the way I trust mathematics, so I am always 'suspicious'. With Python, I use it for user interface stuff and server-side backend (HTML) processing, which both are at best a "best effort" scheme, without any true guarantees of successful functionality; with much, much heavier emphasis on things like data security, privilege separation/escalation models, and so on.