> На Перловке или каком-то другом языке как будто нельзя так написать. "Нельзя написать" и "понятнее, там даже отступы обязательны" -- две большие разницы.
> Какие-нибудь конкретные претензии к питону может кто озвучить?
Так выше вон, отличная демонстрация костыльного синтаксиса:
{} - dict
{()} - set
_ - конкретное значение в зависимости от контекста, более упрощенный пример:
__ = [1,2]; _= range(10);[_ for _ in _ if _ not in __]
[0, 3, 4, 5, 6, 7, 8, 9]
subset = [1,2]; some_range = range(10);[x for x in some_range if x not in subset]
[0, 3, 4, 5, 6, 7, 8, 9]
lambda - умеет только выражения, хотя ЯП императивный, что [невозможность безкостыльно присвоить или изменить значение] частенько "доставляет". Т.е. передать "my_val = 3.14; for i in range(...) if i == my_val" в качестве анонимной функции не выйдет.
Дефолтные значения в аргументах:
__ = type({( )})
"сохраняется" между вызовами.
демонстрирую:
>>> def f(x, y=list()):... y.append(x)
... print y
...
...
>>> f(1)
[1]
>>> f(2)
[1, 2]
>>> f(1,[])
[1]
>>> f(1)
[1, 2, 1]
Непонятно, нафига ввели синтаксис **kwdargs "def x(**myargs): "
когда оно по сути является словарем (который так же можно было передать)
ну и всякие мелочи:
>>> class F(object):... def noself(): return "hello"
... def __init__(self):
... self.self = lambda: "world"
...
>>> F().self()
'world'
>>> F().noself()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: noself() takes no arguments (1 given)
>>> 1, + 2,
(1, 2)
>>> (1,) + (2,)
(1, 2)
>>> (1,) + 2,
Traceback (most recent call last):
File "<input>", line 1, in <module>
(1,) + 2
"однородность" синтаксиса аж "изо всех щелей".
При попытках использовать динамизм на всю (манкипатчинг) начинают вылезать особенности реализации:
>>> d={1:2,2:3}
>>> d.__getitem__ = lambda: "d"Traceback (most recent call last):
File "<input>", line 1, in <module>
d.__getitem__ = lambda: "d"
>>> int.__add__ = lambda: "d"
Traceback (most recent call last):
File "<input>", line 1, in <module>
int.__add__ = lambda: "d"