Этот метод выполняет поиск первой группы словных символов (то есть: [a-zA-Z0-9_]
), возвращая первую согласованную группу или None
в случае сбоя.Операции «Boolean» в Python (т.е.: и/или операторы)
def test(str):
m = re.search(r'(\w+)', str)
if m:
return m.group(1)
return None
Ту же функцию можно переписать в виде:
def test2(str):
m = re.search(r'(\w+)', str)
return m and m.group(1)
Это работает так же, и документируется поведение; а this page ясно сказано:
Выражение
x and y
сначала вычисляетx
; еслиx
является ложным, возвращается его значение; в противном случае вычисляетсяy
и возвращается полученное значение.
Однако, будучи булевым оператором (он даже говорит об этом в руководстве), я ожидал, что and
вернет логическое значение. В результате я был astonished, когда узнал (как это работает).
Каковы другие варианты использования этого и/или что является обоснованием для этой довольно неинтуитивной реализации?
На самом деле на нескольких языках это, конечно, предшествует Python. Это традиционно использовалось в качестве замены тернарного условного выражения, прежде чем мы имели выражения if if else, и его все еще можно использовать как оператор C# с нулевым коалесцированием '??'. Лично я бы старался избегать всех, кроме небольшого тривиального использования этого, как из-за потенциальных проблем с «ложными» значениями, так и потому, что «явный лучше, чем неявный». 'return m и m.group (1)' довольно хорошо, но если вы пойдете дальше этого, 'm не является None и ...' может быть более ясным. – bobince