Я пишу небольшое приложение, которое должно выполнить некоторые проверки работоспособности перед тем, как войти в исполнение.(например, проверки работоспособности: проверьте, доступен ли какой-либо путь для чтения / записи / существует)
Код:
import logging
import os
import shutil
import sys
from paths import PATH
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger('sf.core.sanity')
def sanity_access(path, mode):
ret = os.access(path, mode)
logfunc = log.debug if ret else log.warning
loginfo = (os.access.__name__, path, mode, ret)
logfunc('%s(\'%s\', %s)==%s' % loginfo)
return ret
def sanity_check(bool_func, true_func, false_func):
ret = bool_func()
(logfunc, execfunc) = (log.debug, true_func) if ret else \
(log.warning, false_func)
logfunc('exec: %s', execfunc.__name__)
execfunc()
def sanity_checks():
sanity_check(lambda: sanity_access(PATH['userhome'], os.F_OK), \
lambda: None, sys.exit)
Мой вопрос связан с функцией sanity_check
.
Эта функция принимает 3 параметра (bool_func
, true_func
, false_func
).Если bool_func
(который является тестовой функцией, возвращающей логическое значение) завершается неудачно, true_func
выполняется, в противном случае false_func
выполняется.
1) lambda: None
это немного неубедительно, потому что, например, если sanity_access возвращает True, lambda: None
будет выполнено, и будет напечатан вывод:
DEBUG:sf.core.sanity:access('/home/nomemory', 0)==True
DEBUG:sf.core.sanity:exec: <lambda>
Так что в журналах не очень ясно, какая функция получилаказнены.Журнал будет содержать только <lambda>
.Есть ли функция по умолчанию, которая ничего не делает и может быть передана в качестве параметра?Это способ вернуть имя первой функции, которая выполняется внутри лямбда?
Или способ не регистрировать это "exec", если в качестве параметра передается 'Ничто'?
Что такое эквивалент «нет / ничего» для функций?
sanity_check(lambda: sanity_access(PATH['userhome'], os.F_OK), \
<do nothing, but show something more useful than <lambda>>, sys.exit)
Дополнительный вопрос, почему lambda: pass
вместо lambda: None
не работает?