Наиболее питонический способ переключения переменной между двумя значениями - PullRequest
1 голос
/ 27 июня 2019

У меня есть переменная p, которая является выводом совпадения регулярного выражения и в любом смешанном случае гарантированно будет либо «true», либо «false». Если «true», я хочу, чтобы оно было «FALSE», а если «false», я хочу, чтобы оно было «TRUE». Конечный результат всегда в верхнем регистре.

Я подумал о следующих четырех методах. Какой самый питонический или лучший?

p=['TRUE','FALSE'][eval(p.capitalize())]
p=(not eval(p.capitalize())).__repr__().upper()
p='FALSE' if eval(p.capitalize()) else 'TRUE'
p={'TRUE':'FALSE','FALSE':'TRUE'}[p.upper()]

Ответы [ 3 ]

6 голосов
/ 27 июня 2019

IMO, самый питонический способ не с eval, или с дураками, или с использованием двухэлементной индексации списка, это простое условное условие if-else (или троичное):

p = 'TRUE' if p.upper() == 'FALSE' else 'FALSE'

Он не использует хаки или хитрости, он прост и (что более важно) читабелен.

1 голос
/ 27 июня 2019

Решение с помощью @ cs95 - путь, но вот (IMO) приемлемая (хотя и менее читаемая и, возможно, более сложная) альтернатива:

p = str(p.upper() == "FALSE").upper()
0 голосов
/ 27 июня 2019

РЕДАКТИРОВАНИЕ: Как насчет

p=str(p.lower()!="true").upper()

Без циклов, без if, без сложных функций. Просто измените функции типа. Коротко и просто;)

...