Python: некоторые вопросы новичка по sys.stderr и использование функции в качестве аргумента - PullRequest
3 голосов
/ 14 апреля 2010

Я только начинаю на 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 ]

2 голосов
/ 14 апреля 2010

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

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

sys.exit(1)

и если ошибки нет, просто дайте сценарию исчерпать операторы или:

sys.exit(0)
2 голосов
/ 14 апреля 2010

Нет причин для «logThisAndExit», это не спасет вас от набора текста более

sys.exit(logThis(text)+display)

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

или

sys.exit(logThis(text))

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

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

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

1 голос
/ 14 апреля 2010

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

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 голос
/ 14 апреля 2010

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

0 голосов
/ 14 апреля 2010

Так же, как ссылка, это мой окончательный код после ассимиляции подсказок от Дэвида и Мошеза. В конце концов я решил, что мне нужна всего 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))
...