2016-12-16 3 views
1

Например, если я читаю некоторый код, который работает следующим образом:При написании/чтении кода python, как люди говорят, является ли переменная объектом или нет?

list_of_objects = function_returning_object_list() 
for object in list_of_objects: 
    do_something(object.param) 

не object.get_param вида странно видеть, если вы просто читать код и не знаете, что на самом деле делает function_returning_object_list() вернуть список объектов? Без переменной ввода, как избежать такой путаницы с помощью соглашений об именах?

Надеюсь, что я понятна.

+1

Вы всегда можете проверить его тип, например, с помощью 'type()'. Но в целом тип объекта должен быть довольно ясным в хорошо написанном коде и часто подразумевается именем функции. – Natecat

ответ

3

Это может быть вопрос, основанный на мнениях, но я попытаюсь ответить.

Хорошие имена переменных всегда помогают независимо от языка. Если у вас есть функция с именем, скажем, get_data, вы не можете действительно вывести, что если эти данные представляют собой один объект или список или что-то еще. Но вместо этого, если у вас есть class Bunny и некоторая функция с именем get_bunnies, можно с уверенностью предположить, что он вернет какую-то коллекцию. Конечно, всегда возникает вопрос, является ли коллекция list или dict, например.

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

Вкратце цель Duck Typing: «Если она гуляет, как утка, плавает как утка и шарлатанцы, как утка, то, возможно, это утка». Это означает, что даже если get_bunnies возвращает некоторый причудливый подкласс dict, вы должны использовать его, как будто это dict, если он реализует правильные __dunder__-методы.

Утиная печать всегда, конечно, вызывает некоторые проблемы, которые сильная типизация не делает, но это обычно является вопросом конвенции. Если вы не уверены, что какая-то функция вернется, вы всегда можете ее протестировать: в своем коде, в интерпретаторе или даже при поиске источника.

О «венгерской нотации» переменных имен, таких как strName или name_string ... Я всегда соглашался с Робертом К. Мартином, что он привносит ненужную избыточность в имена переменных. Конечно, reduncancy не так уж плохо с динамической типизацией, но даже в этом случае мне это не нравится. Это имеет тенденцию просто усложнять чтение кода и поиск через него. Или даже более того, когда тип переменной изменяется без изменения имени ...

Если у вас нет ни кода примера, ни хорошего имени, вам нужно будет либо искать исходный код, либо надеяться, что есть docstring, включенных в определение функции. Если вам повезло, а docstrings определены и обновлены до, то хорошая IDE поможет вам разобрать эту строку для вас или даже для всего определения функции без необходимости искать исходный файл самостоятельно.

+0

Это был ответ, который я искал, более или менее. Благодарю. – frei

0

Ну, все в Python действительно является объектом. Соответствующий вопрос здесь будет, если каждый возвращаемый объект имеет атрибут param.

In [17]: a = 1 

In [18]: type(a) 
Out[18]: int 

In [19]: b = 'b' 

In [20]: type(b) 
Out[20]: str 

In [21]: c = True 

In [22]: type(c) 
Out[22]: bool 

Если вы посмотрите на приведенные выше примеры, вы увидите, что они объекты типа str, int и bool. Проблема в том, что ни у одного из них нет атрибута param.

+0

Я предполагаю, что мне интересно, является ли символическое обращение к объекту по его типу хорошей идеей или нет. Например, как различать 'wow_string = str ('wow')' или 'wow_string = CustomStringClass ('wow')', или же это хорошие обозначения в первую очередь. – frei

+0

Вы можете использовать 'isinstance', чтобы проверить, к какому из этих двух объектов класса принадлежит. – Fejs

+0

Венгерская нотация считается очень неряшливой, если это ваш вопрос. –