gpt4 book ai didi

python - 将 'None' 作为函数参数传递(其中参数是函数)

转载 作者:太空狗 更新时间:2023-10-29 20:37:35 25 4
gpt4 key购买 nike

我正在编写一个小应用程序,它必须在进入执行之前执行一些“健全性检查”。 (例如,完整性检查:测试某个路径是否可读/可写/存在)

代码:

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_functrue_funcfalse_func)。如果bool_func (这是测试函数,返回一个 bool 值)失败,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> .是否有一个什么都不做并且可以作为参数传递的默认函数?是否可以返回在 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不工作?

最佳答案

所有无用的 lambda 是怎么回事?好吧,也许可选参数会对您有所帮助:

def sanity_check( test, name='undefined', ontrue=None, onfalse=None ):
if test:
log.debug(name)
if ontrue is not None:
ontrue()
else:
log.warn( name )
if onfalse is not None:
onfalse()

def sanity_checks():
sanity_check(sanity_access(PATH['userhome'], os.F_OK), 'test home',
onfalse=sys.exit)

但你真的把事情复杂化了。

关于python - 将 'None' 作为函数参数传递(其中参数是函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com