我有一些python腳本的行爲取決於運行腳本時用戶傳遞的條件。Python中的條件全局Lambdas
假設我有兩個lambda表達式; verbose_print
和math_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。而不是兩個lambda,如果有十一個呢?每次進口時我都不想手動設置11個lambda表達式!
有沒有更好的方式處理這種有條件的行爲?我正在計劃使用python來創建更多的個人腳本,並且我想知道我是否正在走正確的道路。
聽起來像'logging'模塊的工作。您可以簡單地設置記錄器的日誌級別,甚至可以維護兩個不同的記錄器,每個記錄器都有自己的級別。 – shx2
對我的例子來說是一個很好的解決方案,但是如果lambda是更少的print-y,比如'math_foo = lambda x,y:x ^(x + y)如果args.use_math else y'? – Andrew
稍微高效一點,因爲你不打包'print':'verbose_print = print如果args.verbose而不是args.quiet else lambda x:0'。 (假設你在運行過程中沒有更新'args' ...) – chepner