Как я пишу декоратору, который восстанавливает cwd?

Неправильно, если быть точным:

  1. if isHere is true, возвращается результат getHereCount ()
  2. , иначе возвращается результат getAwayCount ()

То, что «вернулось», очень важно. Это означает, что методы должны возвращать значение, и это значение должно быть назначено где-то.

Кроме того, это не совсем синтаксически эквивалентно версии if-else. Например:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

Если кодировка с if-else всегда приведет к большему байт-коду.

28
задан taras 27 July 2018 в 09:50
поделиться

3 ответа

Ответ для декоратора был дан; это работает на функциональном этапе определения согласно просьбе.

С 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. Так как за мой ответ проголосовали, справедливо предложить полный ответ, все другие проблемы в стороне.

42
ответ дан tzot 28 November 2019 в 02:24
поделиться

Данным ответам не удается принять во внимание, что обернутая функция может повысить исключение. В этом случае каталог никогда не будет восстанавливаться. Код ниже добавляет обработку исключений к предыдущим ответам.

как декоратор:

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)
22
ответ дан dpercy 28 November 2019 в 02:24
поделиться
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
4
ответ дан Daryl Spitzer 28 November 2019 в 02:24
поделиться
Другие вопросы по тегам:

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