首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的条件全局Lambdas

Python中的条件全局Lambdas
EN

Stack Overflow用户
提问于 2015-11-04 19:38:26
回答 2查看 107关注 0票数 2

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

假设我有两个lambda:verbose_printmath_foo,我想用它们在python脚本中有条件地执行某些事情,这取决于是否设置了-m-v标志。

代码语言:javascript
复制
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)))

这种方法确实有效,但我很好奇是否有更多的丙酮溶液来解决这类问题。例如,如果我想将此文件作为import使用,但仍然希望日志详细事件,则需要在该新文件中重新定义lambda。而不是两只羔羊,如果有十一只呢?我不想每次进口的时候都手工设置十一块羊羔!

有更好的方法来处理这种有条件的行为吗?我计划使用python编写更多的个人脚本,我想知道我是否走上了正确的道路。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-04 20:13:46

当我看到类似verbose_print = lambda x: 0的东西时,我诅咒那些试图用这种奇怪的方式解释lambda的可怕的教程。lambdas是匿名函数,当您不想定义命名函数时,就使用它.但这正是任务所做的。在处理args时,只需定义打印函数并在主目录中设置verbose即可。

代码语言:javascript
复制
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)))
票数 2
EN

Stack Overflow用户

发布于 2015-11-04 19:57:22

正如注释中提到的,您应该使用日志模块。

代码语言:javascript
复制
parser.add_argument('-v', '--verbose', action="count", help="verbose level... repeat up to -vvvv.")

...
args.verbose = min(args.verbose,4)
my_logging_logger.setLevel("CRITICAL ERROR WARN INFO DEBUG".split()[args.verbose])

同样的,如果是别的什么

代码语言:javascript
复制
some_fn = lambda x:0
data = {"verbose":lambda x:x**2+sqrt(x),"quiet":lambda x:-1}
for k in dir(args): #I think you can do this ... I dont use argparse enough
   if k in data:
       some_fn = getattr(args,k)
       break;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33530553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档