Это может быть вопрос, основанный на мнениях, но я попытаюсь ответить.
Хорошие имена переменных всегда помогают независимо от языка. Если у вас есть функция с именем, скажем, get_data
, вы не можете действительно вывести, что если эти данные представляют собой один объект или список или что-то еще. Но вместо этого, если у вас есть class Bunny
и некоторая функция с именем get_bunnies
, можно с уверенностью предположить, что он вернет какую-то коллекцию. Конечно, всегда возникает вопрос, является ли коллекция list
или dict
, например.
Но если вы просто читаете такой код, вы можете быстро вывести, что если он используется с ключевыми словами, это dict
или его производная.
Вкратце цель Duck Typing: «Если она гуляет, как утка, плавает как утка и шарлатанцы, как утка, то, возможно, это утка». Это означает, что даже если get_bunnies
возвращает некоторый причудливый подкласс dict
, вы должны использовать его, как будто это dict
, если он реализует правильные __dunder__
-методы.
Утиная печать всегда, конечно, вызывает некоторые проблемы, которые сильная типизация не делает, но это обычно является вопросом конвенции. Если вы не уверены, что какая-то функция вернется, вы всегда можете ее протестировать: в своем коде, в интерпретаторе или даже при поиске источника.
О «венгерской нотации» переменных имен, таких как strName
или name_string
... Я всегда соглашался с Робертом К. Мартином, что он привносит ненужную избыточность в имена переменных. Конечно, reduncancy не так уж плохо с динамической типизацией, но даже в этом случае мне это не нравится. Это имеет тенденцию просто усложнять чтение кода и поиск через него. Или даже более того, когда тип переменной изменяется без изменения имени ...
Если у вас нет ни кода примера, ни хорошего имени, вам нужно будет либо искать исходный код, либо надеяться, что есть docstring, включенных в определение функции. Если вам повезло, а docstrings определены и обновлены до, то хорошая IDE поможет вам разобрать эту строку для вас или даже для всего определения функции без необходимости искать исходный файл самостоятельно.
Вы всегда можете проверить его тип, например, с помощью 'type()'. Но в целом тип объекта должен быть довольно ясным в хорошо написанном коде и часто подразумевается именем функции. – Natecat