Я всегда был участником .NET с тех пор, как начал работать (~ 6 лет). Недавно я работаю над проектом с использованием Django, который требует, чтобы я изучал Python параллельно. Много раз я сталкивался с кодом Python, который выглядел просто, но я просто не мог понять. И вот один из них.
class TypedProperty(object):
def __init__(self, name, type, default=None):
self.name = "_" + name
self.type = type
self.default = default if default else type()
Может ли кто-нибудь объяснить мне, что делает последняя строка кода?
Я надеюсь, что этот вопрос не слишком тривиален, поскольку у меня возникают проблемы с хорошим заголовком для него.
a if b else c
- условное выражение, которое оценивается как a
, если b
оценивается как True
и c
в противном случае. В данном контексте это проверяет, есть ли default
"trucy" , и в этом случае он сохраняется в self.default
. В противном случае создается новый экземпляр type
и строит его в self.default
.
Обратите внимание, что эта реализация имеет несколько проблем:
Он использует type
как имя переменной, затеняя встроенный type()
. Это считается плохим стилем.
В нем используется условие if default
, где на самом деле должно использоваться if default is None
. Проверка предназначена для проверки того, действительно ли параметр default
передан конструктору. Как бы то ни было, реализация не примет значения по умолчанию, которые оценивается как False
.
if arg is not None: x = default
если вы точно не знаете, что хотите их исключить.
В сигнатуре функции вы видите default=None
- это означает, что если третий аргумент не передан, default
будет равен None
.
Эта последняя строка наивно проверяет, соответствует ли default
true, чтобы определить, было ли выполнено значение по умолчанию. Если default
- true, тогда self.default
будет установлен на него. В противном случае self.default
устанавливается в экземпляр type
, переданный в.
Я говорю наивно, потому что default
может быть 0
, или может быть False
, или (более вероятно) это может быть объект, но этот объект как-то оценивает False. Я бы предпочел
self.default = default if default is not None else type()
Или, чтобы избежать условного выражения, которое я не нахожу самым ясным в мире
if default is None:
self.default = type()
else:
self.default = default
self.default = default if (default is not None) else type()
даже если круглые скобки избыточны, это менее многословно, чем 4-строчная версия, но немного более читабельно, чем 1-строка без Паренс
Это тернарный оператор Python (aka условное выражение) в действии! Что-то стоит ничего, что Python оценивает логически лениво, поэтому в этом случае:
self.default = default if default else type()
Это эквивалентно этому:
self.default = default or type()
Если default
оценивает любое значение, отличное от False, его значение будет использоваться, в противном случае оно будет type()
.