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))