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)
Это работает, но мне не нравится, как это выглядит. Есть ли лучший способ написать это (возможно, только с 1 функцией), и есть ли что- то еще, что меня должно беспокоить при выходе?
Теперь к некоторому фону (но не о 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
функционировать? Я действительно всегда стараюсь их избегать, хотя. Конечно, я подумал об использовании if
вместо другого def
, но это не было бы лучше или хуже.
В любом случае, есть мысли?
5 ответов
Там нет причин для "logThisAndExit", это не спасает вас от набора текста
sys.exit(logThis(text)+display)
(ср logThisAndExit(text, display)
)
или же
sys.exit(logThis(text))
(ср logThisAndExit(text)
)
Не то чтобы я был полностью уверен, почему вам нравятся ваши выходные сообщения, отформатированные как строки журнала.
В ответ на ваш оригинальный вопрос: вы пропустите скобки: call(msg+display)
работает отлично. Но я думаю, что это слишком много для входа / выхода. Любой, кто поддерживает ваш код, должен понимать вашу функцию, чтобы знать, когда он выходит, а когда нет.
Для ведения журнала, вероятно, проще использовать модуль ведения журнала.
Для выхода, если у вас есть какая-либо ошибка, используйте:
sys.exit(1)
и если ошибки нет, просто дайте сценарию исчерпать операторы или:
sys.exit(0)
Вы можете изменить logThis
принять последний аргумент под названием shouldExit
который по умолчанию None
затем в качестве последнего шага в этом методе, если значение равно true, тогда вызовите sys.exit
,
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)
Точно так же это мой окончательный код после ассимиляции подсказок Дэвида и Мошеза. В конце концов я решил, что мне нужна всего 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))