在以后可能会导入的脚本上,有什么好方法可以处理命令行选项?

时间:2019-06-07 00:24:16

标签: python command-line-arguments python-import

假设您正在编写一个脚本,希望该脚本可以直接从命令行执行,也可以将功能导入其他地方。作为命令行可执行文件,您可能希望将标志作为选项传递。如果以后要导入脚本,则使每个选项成为每个函数中的参数可能会很麻烦。下面有一个脚本,希望使用verbosity选项说明我的观点。

#!/usr/bin/python

def getArgs():
    parser = argparse.ArgumentParser()
    parser.add_argument('input',type=int)
    parser.add_argument('-v','--verbose',action='store_true')
    return parser.parse_args()

def main(input,verbose):
    result = calculation(input,verbose) 
    if verbose:
        print(str(input) + " squared is " + str(result))
    else:
        print(result)

def calculation(input,verbose):
    if verbose:
        print("Doing Calculation")
    result = input * input
    return result 

if __name__ == '__main__': #checks to see if this script is being executed directly, will not run if imported into another script
    import argparse
    args=getArgs()
    if args.verbose:
        print("You have enabled verbosity")
    main(args.input,args.verbose)

这里有一些说明性的执行方式

user@machine ~ $ ./whatever.py 7
49
user@machine ~ $ ./whatever.py -v 7
You have enabled verbosity
Doing Calculation
7 squared is 49
user@machine ~ $ python
Python 3.7.3 (default, Mar 26 2019, 21:43:19) 
[GCC 8.2.1 20181127] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import whatever
>>> whatever.main(7,False)
49
>>> whatever.main(7,True)
Doing Calculation
7 squared is 49

此脚本有效,但是我相信在以后导入脚本的情况下,有一种更简洁的方式来处理命令行选项,例如强制使用默认选项。我想一个选择是将选项视为全局变量,但我仍然怀疑,在以后的函数中包括这些选项的方式不太冗长(双关语)。

1 个答案:

答案 0 :(得分:1)

当您有许多都具有相同参数的函数时,请将这些参数放在一个对象中,并考虑使该函数成为其类型的方法:

class Square:
  def __init__(self,v=False): self.verb=v
  def calculate(self,x):
    if self.verb: print(…)
    return x*x
  def main(self,x):
    if self.verb: print(…)
    y=self.calculate(x)
    print("%s squared is %s"%(x,y) if self.verb else y)

if __name__=="__main__":
  args=getArgs()
  Square(args.verbose).main(args.input)

False的默认设置通常是API客户端想要的。)