Установка переменной с помощью различных условных операторов

#python #syntax

#питон #синтаксис

Вопрос:

У меня есть это закодированное на python утверждение:

 is_headless = ["--headless"] if sys.argv[0].find('console.py') != -1 else [""]  
  1. Каким образом пробел между ["--headless"] if строками кода и управляет ими?
  2. Как и будет "--headless" ли когда-либо элемент в is_headless переменной?
  3. Использование имени переменной is_headless предполагает, что конечным значением будет True или False . Является ли это правильным мышлением? В каком случае будет True или False будет назначено?
  4. Есть [""] ли способ указать False ?
  5. Немного растерян…

Комментарии:

1. Не могли бы вы уточнить первый пункт? — Каким образом пробел между [«—безголовый»] и if управляет строкой кода?

2. Пробел не имеет никакого эффекта, вы можете написать ["--headless"]if , и он будет иметь то же значение. Пробел просто делает его более читабельным, например foo = 1 , вместо foo=1

3. Пробелы необходимы только в том случае, если нет другого разделителя для разделения маркеров. Вы могли бы написать всю строку как is_headless=["--headless"]if sys.argv[0].find('console.py')!=-1 else[""]

4. ооо, пространство-вот что он имел в виду. Я думал, что так оно и есть, но потом подумал, что все не может быть так просто. Хотя теперь я понимаю вопрос немного лучше, однако последняя часть «управление строкой кода» — это то, на чем мне сейчас нужно сосредоточиться.

Ответ №1:

  1. Каким образом пробел между ["--headless"] if строками кода и управляет ими?

Вы можете проанализировать утверждение следующим образом:

 is_headless = lt;expressiongt;  

где lt;expressiongt; находится форма lt;true_valuegt; if lt;conditiongt; else lt;false_valuegt; . Выражение принимает значение либо lt;true_valuegt; или lt;false_valuegt; в зависимости от результата lt;conditiongt; , и присваивается одно из этих двух значений is_headless .

  1. Как --headless вообще может быть элемент в is_headless переменной?

Общий эффект заключается в присвоении одного из двух значений is_headless или ["--headless"] или [""] . Любопытно, что оба они являются списками с одним значением. Давайте поговорим об этом…

  1. Использование имени переменной is_headless предполагает, что конечным значением будет True или False . Является ли это правильным мышлением? В каком случае будет True или False будет назначено?

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

  1. Есть [""] ли способ указать False ?

Предполагается, что это означает «без аргументов». Например, не передавайте дополнительный аргумент следующей команде. Наличие пустой строки, вероятно, является ошибкой; Я бы предпочел видеть пустой список [] вместо списка, содержащего пустую строку [""] .

Было бы лучше , если бы переменная называлась просто headless , или headless_argument .

Или, что бы я написал:

 extra_arguments = [] if sys.argv[0].find('console.py') != -1:  extra_arguments.append('--headless')  

Вот как бы я это назвал: extra_arguments . Это список дополнительных аргументов, которые могут быть переданы, а могут и не быть переданы. По умолчанию это пустой список, и если условие верно, то мы добавляем в список дополнительный аргумент --headless .

  1. Немного растерян…

Я тебя не виню!

Комментарии:

1. Лучшим именем для переменной может быть headless_opt то, что она содержит --headless опцию, когда это необходимо.

2. Спасибо, Джон! Будучи новичком в python, я не знал о операторе if-then-else в синтаксисе одной строки. Продолжая свое исследование, я вижу, что это обсуждалось в других вопросах.

Ответ №2:

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

Например, замена примерных значений, таких как » a » и «b», и использование строки вместо аргументов, передаваемых в командной строке, должны помочь сделать это более понятным для целей иллюстрации:

 args = 'python console.py testing' x = 'a' if args.find('console.py') != -1 else 'b' print(x)  args = 'python testing' x = 'a' if args.find('console.py') != -1 else 'b' print(x)  

Из:

 a b  

Кроме того, для полноты изложения, чтобы вернуться к другим вашим вопросам:

  1. Когда вводимые пользователем данные содержат слово console.py
  2. Да, именование переменных не слишком велико. Имя is_headless обычно указывает на то, что var является логическим типом, но здесь это не так, поскольку var фактически присваивается список строк, которые могут быть аннотированы, list[str] например.
  3. Ну, технически [""] это не ложь, но пустой список [] можно считать ложным. Я не слишком понимаю, почему это задано здесь, однако, возможно, здесь может быть полезен дополнительный контекст.