簡體   English   中英

Python中的條件全局Lambda

[英]Conditional Global Lambdas in Python

我有一些python腳本,其行為取決於運行腳本時用戶傳遞的條件。

假設我有兩個lambda; verbose_printmath_foo ,我想用來根據我的-m-v標志是否設置來有條件地在python腳本中執行某些操作。

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。 如果沒有11個,該怎么辦呢? 我不想每次導入時手動設置11個lambda!

有沒有更好的方法來處理這種條件行為? 我計划使用python進行更多個人腳本編寫,並且我想知道我是否走對了路。

當我看到verbose_print = lambda x: 0我詛咒試圖以這種奇怪方式解釋lambda的可怕教程。 lambda是匿名函數,當您不想定義命名函數時使用...。但這正是分配所要做的。 只需定義打印功能,並在處理args時在主體中設置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)))

如評論中所述,您應該使用日志記錄模塊

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])

如果還有其他事情

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM