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))
Другие вопросы по тегам