Поменять бы синтаксис описания класса в Python

Если на протяжении достаточного продолжительного времени вы использовали какой-либо язык программирования для «материализации» своих мыслей, то обязательно найдётся то, что хотелось бы изменить. Такая штука произошла у меня с Python. Есть несколько мыслей по поводу Python, которые требуют (имхо) его изменений, но, к сожалению, это не в моих силах. Тем не менее, одной из них я вас загружу: синтаксис описания классов.

Начнем сию мыслю с синтаксиса определения функций. У него действительно хорошее свойство: описание функций соответствует их вызову. Описание выглядит следующим образом:

def func_name ( arg1, arg2 ): 

При вызове используется похожий синтаксис: имя функции и список фактических аргументов в скобках через запятую:

x = func_name ( 12, 34 ) 

Если сравнить запись вызова с описанием функции, то всем ясно и понятно, что формальному аргументу arg1 соответствует фактическое значение 12, а arg2, естественным образом, соответствует 34. Замечательно.

А теперь обратимся к описанию класса-наследника базовых классов:

class MyClass ( BaseClass, AnotherBase ): 

При создании экземпляра этого класса, вы используете имя класса и аргументы конструктора, но теперь аналогия пропадает. Вы не передаете родительский BaseClass для создания MyClass:

my_obj = MyClass ( ... ) 

Глядя на строку описания класса, вы не можете сказать, что должно быть в скобках при создании объект (экземпляра класса) MyClass. Таким образом, def и class имеют очень сходный синтаксис, вызов функций и создание экземпляров класса так-же имеют очень сходный синтаксис, но аналогия в вызове функции приводит вас к правильной ассоциации и полностью сбивает с толку при создании объектов.

Это то, когда можно сказать «мимо кассы». Загадочно используется схожий синтаксис для качественно различных вещей, а лёгкие различия определяются в контексте. В языках для программирования многое из этого неизбежно: символов очень много, а концепций ещё больше. Так что совпадения должны быть.

Но в наших силах сделать всё лучше. Зачем использовать круглые скобки, которые используются для описания функции при обозначения базовых классов? Мне кажется, что такой синтаксис будет лучше и понятней:

class MyClass from BaseClass, AnotherBase : 

Это не только позволяет избежать вводящей в заблуждение аналогии, но даже совершенно естественно для английского, когда мы говорим о классах: MyClass наследуется от BaseClass и AnotherBase. И from уже является ключевым словом Python.

Кстати, даже опытные программеры иногда допускают ошибки, набирая def там, где надо написать class. До исполнения кода и трассировки подобную ошибку трудно обнаружить и это может сбить с толку.

Я не настаиваю немедленно изменить Python. Не потому, что так было бы лучше, а потому, что подобное изменение нецелесообразно для крайнего релиза, уже опоздало. Я предполагаю добавить этот синтаксис в качестве альтернативного. Однако, дерзко утверждать, что существование двух способов описания классов было бы лучше для начинающих.

Но я думаю, что полезно попытаться увидеть наш знакомый пейзаж там, где новички запутаются. Им это можно просто объяснить, а нам, возможно, это поможет сделать правильный выбор в будущем.

Источник вдохновения: Why Python class syntax should be different

CC BY-NC 4.0 Поменять бы синтаксис описания класса в Python, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.


Респект и уважуха

Добавить комментарий