Предположим, у вас есть функция, которая может вернуть некоторый объект или нет:Не вызывайте функцию, если None Возвращаемое значение
def foobar(arg):
if arg == 'foo':
return None
else:
return 'bar'
Теперь вы вызываете этот метод и вы хотите сделать что-то с объектом, для этого примера Я получаю str
, поэтому я могу назвать функцию upper()
. Есть теперь два случая, которые могут произойти, когда второй один потерпит неудачу, потому что никто не имеет метода upper()
foobar('sdfsdgf').upper()
foobar('foo').upper()
, конечно, это теперь легко исправить:
tmp = foobar('foo')
if tmp is not None:
tmp.upper()
# or
try:
foobar('foo').upper()
except ArgumentError:
pass
# or
caller = lambda x: x.upper() if type(x) is str else None
caller(foobar('foo'))
но обработка исключений возможно, не является достаточно точным, и может случиться, что я поймаю исключение, которое может быть важным (= отладка становится сложнее), в то время как первый метод хорош, но может привести к увеличению кода, а третий вариант выглядит довольно неплохо, но вы должны это сделать для всех возможных функций, поэтому метод один, вероятно, лучший.
Интересно, есть ли какой-либо синтаксический сахар, который прекрасно справляется с этой проблемой?
Вы можете вернуть пустую строку вместо «Нет». – Eddie
да, конечно, но предположим, что функция i call - это библиотека, и я не хочу менять API. – reox
У вас может быть только синтаксический aproach, так как должен быть вызов: ret = foobar (arg); ret.upper(), если ret else pass – cox