Что означает «self.default = default, если default default type ()»?

1

Я всегда был участником .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()

Может ли кто-нибудь объяснить мне, что делает последняя строка кода?

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

  • 0
    Я думаю, что последняя строка должна быть с отступом, чтобы быть частью метода __init__
  • 0
    Похоже на ошибку отступа ... Я думаю, последняя строка должна совпадать с предыдущей (то есть с отступом в 8 пробелов).
Показать ещё 1 комментарий
Теги:

3 ответа

6
Лучший ответ

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.

  • 3
    +1 Другие "ложные" значения включают нули, пустые строки и пустые коллекции. Поэтому обычно лучше использовать, if arg is not None: x = default если вы точно не знаете, что хотите их исключить.
4

В сигнатуре функции вы видите 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
  • 0
    +1 Я бы лично написал это как self.default = default if (default is not None) else type() даже если круглые скобки избыточны, это менее многословно, чем 4-строчная версия, но немного более читабельно, чем 1-строка без Паренс
1

Это тернарный оператор Python (aka условное выражение) в действии! Что-то стоит ничего, что Python оценивает логически лениво, поэтому в этом случае:

self.default = default if default else type()

Это эквивалентно этому:

self.default = default or type()

Если default оценивает любое значение, отличное от False, его значение будет использоваться, в противном случае оно будет type().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню