Метод 'касания' на Строковом объекте не возвращает ожидаемый результат

Как Jarret Hardie, которому отвечают, hasattr, добьется цели. Я хотел бы добавить, тем не менее, что многие в сообществе Python рекомендуют стратегию "легче попросить прощение, чем разрешение" (EAFP), а не "смотрит перед прыганием" (LBYL). Посмотрите эти ссылки:

EAFP по сравнению с LBYL (было Ре: Немного разочарованный до сих пор)
EAFP по сравнению с LBYL @Code Как Pythonista: Идиоматический Python

т.е.:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

... предпочтен:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()

12
задан 3 revs 26 August 2009 в 05:07
поделиться

1 ответ

Object # tap всегда возвращает исходный объект, переданный ему после выполнения блока, даже если блок возвращает что-то другое .

Преимущество здесь состоит в том, что вы можете поместить касание в середину цепочки и проверить значение объекта, не изменяя исходное значение.

Это означает, что если вы передадите «abc» в tap, он выполнит блок и вернет «abc». Ваше назначение на o ничего не значит из-за объема. Точно так же, если вы передадите пустой массив в tap, он вернет пустой массив обратно. Однако во втором примере вы изменили исходное значение. Операции, изменяющие оригинал, например << или gsub! или аналогичным образом изменит объект перед его возвратом, поэтому вы получите обратно другое значение.

Проверьте http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions для еще нескольких интересных примеров того, как использовать кран. Не используйте его для назначения или изменения, иначе вы Я верну шаткие результаты.

Обновление: на вашу правку, почему это решает вашу проблему? Я не понимаю, почему вы вызываете tap для замены, если вы можете просто вызвать replace для самого объекта. Какие преимущества дает вам Tap?

8
ответ дан 2 December 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: