Неправильно, если быть точным:
То, что «вернулось», очень важно. Это означает, что методы должны возвращать значение, и это значение должно быть назначено где-то.
Кроме того, это не совсем синтаксически эквивалентно версии if-else. Например:
String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;
Если кодировка с if-else всегда приведет к большему байт-коду.
Ответ для декоратора был дан; это работает на функциональном этапе определения согласно просьбе.
С Python 2.5 +, у Вас также есть опция сделать это в функции вызов этап с помощью менеджера по контексту:
from __future__ import with_statement # needed for 2.5 ≤ Python < 2.6
import contextlib, os
@contextlib.contextmanager
def remember_cwd():
curdir= os.getcwd()
try: yield
finally: os.chdir(curdir)
, который может использоваться в случае необходимости во время вызова функции как:
print "getcwd before:", os.getcwd()
with remember_cwd():
walk_around_the_filesystem()
print "getcwd after:", os.getcwd()
Это - хорошая опция иметь.
РЕДАКТИРОВАНИЕ: Я добавил обработку ошибок, как предложено codeape. Так как за мой ответ проголосовали, справедливо предложить полный ответ, все другие проблемы в стороне.
Данным ответам не удается принять во внимание, что обернутая функция может повысить исключение. В этом случае каталог никогда не будет восстанавливаться. Код ниже добавляет обработку исключений к предыдущим ответам.
как декоратор:
def preserve_cwd(function):
@functools.wraps(function)
def decorator(*args, **kwargs):
cwd = os.getcwd()
try:
return function(*args, **kwargs)
finally:
os.chdir(cwd)
return decorator
и как менеджер по контексту:
@contextlib.contextmanager
def remember_cwd():
curdir = os.getcwd()
try:
yield
finally:
os.chdir(curdir)
def preserve_cwd(function):
def decorator(*args, **kwargs):
cwd = os.getcwd()
result = function(*args, **kwargs)
os.chdir(cwd)
return result
return decorator
Вот то, как это используется:
@preserve_cwd
def test():
print 'was:',os.getcwd()
os.chdir('/')
print 'now:',os.getcwd()
>>> print os.getcwd()
/Users/dspitzer
>>> test()
was: /Users/dspitzer
now: /
>>> print os.getcwd()
/Users/dspitzer