#python #syntax
#питон #синтаксис
Вопрос:
У меня есть это закодированное на python утверждение:
is_headless = ["--headless"] if sys.argv[0].find('console.py') != -1 else [""]
- Каким образом пробел между
["--headless"]
if
строками кода и управляет ими? - Как и будет
"--headless"
ли когда-либо элемент вis_headless
переменной? - Использование имени переменной
is_headless
предполагает, что конечным значением будетTrue
илиFalse
. Является ли это правильным мышлением? В каком случае будетTrue
илиFalse
будет назначено? - Есть
[""]
ли способ указатьFalse
? - Немного растерян…
Комментарии:
1. Не могли бы вы уточнить первый пункт? — Каким образом пробел между [«—безголовый»] и if управляет строкой кода?
2. Пробел не имеет никакого эффекта, вы можете написать
["--headless"]if
, и он будет иметь то же значение. Пробел просто делает его более читабельным, напримерfoo = 1
, вместоfoo=1
3. Пробелы необходимы только в том случае, если нет другого разделителя для разделения маркеров. Вы могли бы написать всю строку как
is_headless=["--headless"]if sys.argv[0].find('console.py')!=-1 else[""]
4. ооо, пространство-вот что он имел в виду. Я думал, что так оно и есть, но потом подумал, что все не может быть так просто. Хотя теперь я понимаю вопрос немного лучше, однако последняя часть «управление строкой кода» — это то, на чем мне сейчас нужно сосредоточиться.
Ответ №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
.
- Как
--headless
вообще может быть элемент вis_headless
переменной?
Общий эффект заключается в присвоении одного из двух значений is_headless
или ["--headless"]
или [""]
. Любопытно, что оба они являются списками с одним значением. Давайте поговорим об этом…
- Использование имени переменной
is_headless
предполагает, что конечным значением будетTrue
илиFalse
. Является ли это правильным мышлением? В каком случае будетTrue
илиFalse
будет назначено?
Это именно то, чего я ожидал бы, основываясь на имени переменной. А это значит, что это дурная слава. Ему не присваиваются логические значения, поэтому его не следует называть is_xxx
.
- Есть
[""]
ли способ указатьFalse
?
Предполагается, что это означает «без аргументов». Например, не передавайте дополнительный аргумент следующей команде. Наличие пустой строки, вероятно, является ошибкой; Я бы предпочел видеть пустой список []
вместо списка, содержащего пустую строку [""]
.
Было бы лучше , если бы переменная называлась просто headless
, или headless_argument
.
Или, что бы я написал:
extra_arguments = [] if sys.argv[0].find('console.py') != -1: extra_arguments.append('--headless')
Вот как бы я это назвал: extra_arguments
. Это список дополнительных аргументов, которые могут быть переданы, а могут и не быть переданы. По умолчанию это пустой список, и если условие верно, то мы добавляем в список дополнительный аргумент --headless
.
- Немного растерян…
Я тебя не виню!
Комментарии:
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
Кроме того, для полноты изложения, чтобы вернуться к другим вашим вопросам:
- Когда вводимые пользователем данные содержат слово
console.py
- Да, именование переменных не слишком велико. Имя
is_headless
обычно указывает на то, что var является логическим типом, но здесь это не так, поскольку var фактически присваивается список строк, которые могут быть аннотированы,list[str]
например. - Ну, технически
[""]
это не ложь, но пустой список[]
можно считать ложным. Я не слишком понимаю, почему это задано здесь, однако, возможно, здесь может быть полезен дополнительный контекст.