我正在写一个小应用程序,必须执行一些'健全检查'才进入执行。(例如,健全性检查:测试某个路径是否可读/写/存在)
代码:
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
有点蹩脚,因为例如,如果健全访问返回True,则执行lambda: None
,并且打印的输出将是:
DEBUG:sf.core.sanity:access('/home/nomemory', 0)==True
DEBUG:sf.core.sanity:exec: <lambda>
所以在日志中不太清楚执行了什么函数。日志将只包含<lambda>
。是否有一个默认函数什么也不做,并且可以作为参数传递?这是返回lambda中正在执行的第一个函数的名称的方法吗?
或者如果“nothing”作为参数发送,则不记录该“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
不起作用?
你可能想重新考虑一下。
可调用对象可以简化您的生活。
那些毫无用处的羔羊怎么了?好吧,也许可选参数可以帮你一点:
但你真的是太复杂了。
更新
我通常会删除这篇文章,因为THC4k看穿了所有的复杂性,并正确地重写了您的函数。不过,在另一种情况下,K组合技巧可能会派上用场,所以我就不提了。
你想要什么就做什么。我相信您需要K combinator(链接出现在另一个问题上),它可以编码为
当然,如果这只是一个机会,那么你可以
但你就不能说“K组合”。“K_combinator”方法的另一个优点是可以将其传递给函数,例如
至于第二条语句,
lambda
中只允许使用表达式。pass
是一个语句。因此,lambda: pass
失败。通过删除第一个参数周围的lambda,可以稍微简化对健全性检查的调用。
这更具可读性(主要是将三元运算符扩展为if)。
boolfunc
没有做任何事情,因为sanity_check
没有向调用添加任何参数。不如直接调用而不是用lambda包装它。相关问题 更多 >
编程相关推荐