我有一些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)))这种方法确实有效,但我很好奇是否有更多的丙酮溶液来解决这类问题。例如,如果我想将此文件作为import使用,但仍然希望日志详细事件,则需要在该新文件中重新定义lambda。而不是两只羔羊,如果有十一只呢?我不想每次进口的时候都手工设置十一块羊羔!
有更好的方法来处理这种有条件的行为吗?我计划使用python编写更多的个人脚本,我想知道我是否走上了正确的道路。
发布于 2015-11-04 20:13:46
当我看到类似verbose_print = lambda x: 0的东西时,我诅咒那些试图用这种奇怪的方式解释lambda的可怕的教程。lambdas是匿名函数,当您不想定义命名函数时,就使用它.但这正是任务所做的。在处理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)))发布于 2015-11-04 19:57:22
正如注释中提到的,您应该使用日志模块。
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;https://stackoverflow.com/questions/33530553
复制相似问题