Ответ 1
Можно написать стандартный оператор "if" в одной строке:
if x is None: return None
Однако руководство pep 8 style рекомендует не делать этого:
Составляющие утверждения (несколько операторов в одной строке) обычно обескуражены
Можно ли вернуться из метода в одной строке в python
Ищете что-то вроде этого
return None if x is None
Пробовал выше, и это недопустимый синтаксис
Я мог бы легко сделать:
if x is None:
return None
Но просто любопытно, могу ли я комбинировать выше оператор if в одной строке
Можно написать стандартный оператор "if" в одной строке:
if x is None: return None
Однако руководство pep 8 style рекомендует не делать этого:
Составляющие утверждения (несколько операторов в одной строке) обычно обескуражены
Да, он называется условным выражением :
return None if x is None else something_else
Вам нужно else something
в условии, чтобы он работал.
Отказ от ответственности: на самом деле этого не делайте. Если вы действительно хотите, чтобы один лайнер, как и нагофан, сказал, просто нарушите правило из PEP-8. Тем не менее, это иллюстрирует, почему return
не ведет себя так, как вы думали, и что будет выглядеть так, как это должно выглядеть так, как вы думали, return
может.
Причина, по которой вы не можете сказать return None if x is None
, заключается в том, что return
вводит инструкцию, а не выражение. Поэтому нет возможности скопировать его в (return None) if x is None else (pass)
или что-то еще.
Хорошо, мы можем это исправить. Давайте напишем функцию ret
, которая ведет себя как return
, за исключением того, что это выражение, а не полный оператор:
class ReturnValue(Exception):
def __init__(self, value):
Exception.__init__(self)
self.value = value
def enable_ret(func):
def decorated_func(*args, **kwargs):
try:
return func(*args, **kwargs)
except ReturnValue as exc:
return exc.value
return decorated_func
def ret(value):
raise ReturnValue(value)
@enable_ret
def testfunc(x):
ret(None) if x is None else 0
# in a real use-case there would be more code here
# ...
return 1
print testfunc(None)
print testfunc(1)
Вы также можете попробовать выражение list[bool]
:
return [value, None][x == None]
Теперь, если вторая скобка имеет значение true, в противном случае возвращается None, возвращается значение, которое вы хотите вернуть