Python: некоторые новички на sys.stderr и использование функции в качестве аргумента

Я только начинаю с Python и, может быть, слишком рано слишком беспокоюсь, но все равно...

log = "/tmp/trefnoc.log"

def logThis (text, display=""):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    if display != None:
        print msg + display
    logfile = open(log, "a")
    logfile.write(msg + "\n")
    logfile.close()
    return msg

def logThisAndExit (text, display=""):
    msg = logThis(text, display=None)
    sys.exit(msg + display)

Работает, но мне не нравится, как это выглядит. Есть ли лучший способ написать это (возможно, только с одной функцией), и есть ли любая другая вещь Я должен быть обеспокоен выходом?


Теперь к некоторому фону (но не о trefnoc)...

Иногда я вызываю logThis только для регистрации и отображения. В других случаях я хочу позвонить и выйти. Первоначально я делал это:

logThis ("ERROR. EXITING")
sys.exit()

Тогда я понял, что неправильно установил stderr, поэтому текущий код показан сверху.

Моя первая идея состояла в том, чтобы передать "sys.exit" в качестве аргумента и определить только logThis ("ERROR. EXITING", call=sys.exit), определяемый следующим образом (показывая только соответствующую разную часть):

def logThis (text, display="", call=print):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    call msg + display

Но это явно не сработало. Я думаю, что Python не хранит функции внутри переменных. Я не мог (быстро) найти где-нибудь, если Python может иметь переменные, принимающие функции или нет! Может быть, с помощью функции eval? Я всегда стараюсь избегать их, тo. Конечно, я думал использовать if вместо другого def, но это не было бы лучше или хуже.

В любом случае, какие-то мысли?

Ответы

Ответ 1

Нет причин для "logThisAndExit", это не спасет вас от многократного ввода

sys.exit(logThis(text)+display)

(сравните logThisAndExit(text, display))

или

sys.exit(logThis(text))

(сравните logThisAndExit(text))

Не то, чтобы я был уверен, почему вам нравятся сообщения о выходе, отформатированные как строки журнала.

В ответ на ваш исходный вопрос: у вас отсутствуют круглые скобки: call(msg+display) работает нормально. Но я думаю, что waaaay overengineering для регистрации/выхода из материала. Любой, кто поддерживает ваш код, должен будет понять вашу функцию, чтобы знать, когда она выйдет, а когда нет.

Ответ 2

Для ведения журнала, вероятно, проще использовать модуль logging.

Для выхода, если у вас есть какие-либо ошибки, используйте:

sys.exit(1)

и если нет ошибки, либо просто пусть script закончится утверждение или:

sys.exit(0)

Ответ 3

Вы можете изменить logThis, чтобы принять окончательный аргумент shouldExit, который по умолчанию имеет значение None, а затем в качестве последнего шага в этом методе, если значение равно true, тогда вызовите sys.exit.

Ответ 4

print - это ключевое слово, а не функция, в python < 3. попробуйте следующее:

def do_print(x):
    print x

def logThis (text, display="", call=do_print):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    call(msg + display)

Есть ли причина, по которой вы не используете модуль logging? (см. http://onlamp.com/pub/a/python/2005/06/02/logging.html)

Ответ 5

Как ссылка, это мой последний код после усвоения намеков Дэвида и Мошеза. В конце концов я решил, что сейчас хочу только 1 функции. Спасибо всем!

log = "/tmp/trefnoc.log"

def logThis (text, display=""):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    if display != None:
        print msg + display
    logfile = open(log, "a")
    logfile.write(msg + "\n")
    logfile.close()
    return msg

# how to call it on exit:
sys.exit(logThis("ERROR, EXITING", display=None))