Этот метод ищет первую группу символов слова (то есть: [a-zA-Z0-9_]
), возвращая первую совпавшую группу или None
в случае неудачи.
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)
Это работает так же и является задокументированным поведением; как на этой странице четко указано:
Выражение
x and y
сначала оцениваетx
; еслиx
ложно, возвращается его значение; в противном случае оцениваетсяy
и возвращается результирующее значение.
Однако, будучи логическим оператором (об этом даже говорится в руководстве), я ожидал, что and
вернет логическое значение. В результате я был удивлен, когда узнал (как) это работает.
Каковы другие варианты использования этого и / или каково обоснование этой довольно неинтуитивной реализации?
if...else
, и его все еще можно использовать как оператор объединения NULL??
в C#. Лично я бы старался избегать всего, кроме небольших тривиальных применений этого, как из-за потенциальных проблем с «ложными» значениями, так и потому, что «явное лучше, чем неявное».return m and m.group(1)
вполне нормально, но если вы пойдете дальше,m is not None and...
может быть понятнее. - person bobince   schedule 30.09.2010