python - Python 中的条件全局 Lambda

标签 python python-2.7 lambda

我有一些 python 脚本,它们的行为取决于脚本运行时用户传递的条件。

假设我有两个 lambda; verbose_printmath_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/

相关文章:

python - 如何修复 'DataFrame' 对象没有属性 'coalesce'?

python - 如何将掩码从一个数组应用到另一个数组?

python-2.7 - 如何在python中保存直方图?

python - 如何从网络浏览器调用 python get 方法

http - 如何在 Serverless Lambda 中声明一个可选的 get 参数?

Java 8 - For Each 和 removeIf

python - Selenium 逻辑之旅 - 如果通过第一个场景,则移动到下一个 url - Python

Python:如何将用户输入添加到列表中?

node.js - Aws Lambda 响应错误

python - 将 chromalog 添加到 STDOUT 和文件记录