Область видимости переменных. Почему просто было не сделать “снизу вверх”, как в “обычных” языках? Частая глобальная переменная - в каждой функции пиши global. Или передавай её как параметер. Зачем эти сложности на пустом месте?
1. Использование глобальных переменных - частый симптом плохого дизайна. Требуется редко.
2. Потому что
Namespaces are one honking great idea – let's do more of those!Почему бы не сделать вложенных функций? Я не имею в виду lambda, я имею в виду функции строк на 10 с нормальной логикой, несколькими return, и доступом к переменным вышележащей функции.
Вы мне не поверите.
Приведу код из Python ESSENTIAL REFERENCE Fourth Edition
def countdown(start):
n = start
def display():
print('T-minus %d' % n)
def decrement():
n -= 1 # Fails in Python 2
while n > 0:
display()
decrement()
In Python 2, you can work around this by placing values you want to change in a list or
dictionary. In Python 3, you can declare n as nonlocal as follows:
def countdown(start):
n = start
def display():
print('T-minus %d' % n)
def decrement():
nonlocal n # Bind to outer n (Python 3 only)
n -= 1
while n > 0:
display()
decrement()
The nonlocal declaration does not bind a name to local variables defined inside arbi-
trary functions further down on the current call-stack (that is, dynamic scope). So, if
you’re coming to Python from Perl, nonlocal is not the same as declaring a Perl local
variable.
Ещё раз - функция должна оперировать только теми переменными, которые ей дали
явно. Тогда количество side-effects меньше.
Зачем при написании метода класса всегда указывать self? Понятно, что “объектная ориентированность реализована так”, но код-то зачем этим забивать? В “других языках” интерпретатор с таким отлично справляется без пихания self на каждый чих.
Дабы отличать обычные методы от методов класса и статических методов. А так же для того, что бы отличать локальные переменные от атрибутов класса.
И это ещё не все причины.
Почему bytes неизменяем? Что мешало сделать работающим что-то вроде b = 0x10?
Я, наверное, что-то упустил, но в питоне нет встроенного типа bytes.
В третьей версии серьёзно меняли синтаксис… Одно из главнейших отличий (не главное, конечно, но пожалуй, именно это больше всего ударило по питоновким проектам), что print - теперь функция. Проделана огромная работа, многое было переписано заново…
Начиная с версии 2.5, кажется, можно было использовать print как функцию. Но я вас обрадую - это не главное изменнение.
Да и вывод в консоль нужен был не везде.
Да и использовать 3-ку не обязательно, вполне можно использовать 2.6. Пока что.
А этих очевидных вещей не добавили. Почему?! Был бы вообще лучший язык на свете, а тт во многом остаётся ощущение некоторой недоделанности и временности.
Потому что эти вещи даже близко не очевидны. Потому что python - не PHP. Потому что вы не разбираясь принялись выносить суждения.
Такие вопросы и утверждения - троллинг чистой воды.
Хоть Гвидо и “заморозил изменения синтаксиса”, думаю, меняться язык будет. Уж очень нестабильное состояние его сейчас (3.1).
Да, он будет меняться. И это замечательно.
Это “стабильное-нестабильное” мне напоминает нытьё некоторых новых линуксоидов на дебиан и удунту. Для одних он “стар, ибо в стаб. ветке одно старьё” другие ноют что “нестабильно” используя нестабильную ветку.
А чего вы хотели? Хотите стабильного - берите старую но стабильную. Хотите новизны - берите последнее, но тогда, по крайней мере на время, забудьте о “стабильности”.