Как 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()
Object # tap всегда возвращает исходный объект, переданный ему после выполнения блока, даже если блок возвращает что-то другое .
Преимущество здесь состоит в том, что вы можете поместить касание в середину цепочки и проверить значение объекта, не изменяя исходное значение.
Это означает, что если вы передадите «abc» в tap, он выполнит блок и вернет «abc». Ваше назначение на o ничего не значит из-за объема. Точно так же, если вы передадите пустой массив в tap, он вернет пустой массив обратно. Однако во втором примере вы изменили исходное значение. Операции, изменяющие оригинал, например << или gsub! или аналогичным образом изменит объект перед его возвратом, поэтому вы получите обратно другое значение.
Проверьте http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions для еще нескольких интересных примеров того, как использовать кран. Не используйте его для назначения или изменения, иначе вы Я верну шаткие результаты.
Обновление: на вашу правку, почему это решает вашу проблему? Я не понимаю, почему вы вызываете tap для замены, если вы можете просто вызвать replace для самого объекта. Какие преимущества дает вам Tap?