我有一些 python 脚本,它们的行为取决于脚本运行时用户传递的条件。
假设我有两个 lambda; verbose_print
和 math_foo
,我想用它们在 python 脚本中有条件地执行某些操作,具体取决于我的 -m
还是 -v
标志已设置。
from __future__ import print_function # Future-proofing
import argparse #args
verbose_print = lambda x: 0
math_foo = lambda x, y: 0
def main_func(args):
verbose_print("WILL ONLY PRINT WHEN VERBOSE" )
#other main function stuff
conditional_result = math_foo(12,45)
if __name__ == "__main__":
started_at = time.time()
#declare argparse logic separately from main functionality
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose', action='store_true')
parser.add_argument('-m', '--use_math', action='store_true')
args = parser.parse_args()
verbose_print("Began...") # won't print since this will always be lambda x:0
global verbose_print
verbose_print = lambda x: print(x) if args.verbose and not args.quiet else 0
global math_foo
math_foo = lambda x, y: x^(x+y) if args.use_math else y
main_func(args) #run main function
finished_at = time.time()
verbose_print("Finished (Took {} seconds)".format((finished_at-started_at)))
这种方法显然是有效的,但我很好奇是否有更 Pythonic 的解决方案来解决这种问题。例如,如果我想将此文件用作 import
但仍想记录详细事件,则需要在该新文件中重新定义 lambda。如果不是两个 lambda,如果有十一个呢?我不想每次导入时都手动设置 11 个 lambda!
有没有更好的方法来处理这种条件行为?我计划使用 python 编写更多个人脚本,我想知道我是否走在正确的道路上。
最佳答案
当我看到类似 verbose_print = lambda x: 0
的东西时,我诅咒那些试图以这种奇怪的方式解释 lambda
的可怕教程。 lambda 是匿名函数,当您不想定义命名函数时使用......但这正是赋值的作用。只需定义打印函数并在处理参数时在 main 中设置 verbose
即可。
verbose = False
def verbose_print(msg):
global verbose
if verbose:
print(msg)
if __name__ == "__main__":
started_at = time.time()
#declare argparse logic separately from main functionality
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose', action='store_true')
parser.add_argument('-m', '--use_math', action='store_true')
args = parser.parse_args()
verbose_print("Began...") # won't print since this will always be lambda x:0
global verbose
verbose = args.verbose and not args.quiet
global math_foo
math_foo = lambda x, y: x^(x+y) if args.use_math else y
main_func(args) #run main function
finished_at = time.time()
verbose_print("Finished (Took {} seconds)".format((finished_at-started_at)))
关于python - Python 中的条件全局 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33530553/