有没有一种方法可以控制在Python argparse中评估参数的顺序

前端之家收集整理的这篇文章主要介绍了有没有一种方法可以控制在Python argparse中评估参数的顺序 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

让我们来看下面的例子.解析器包含两个参数-inputfile和verbosity. Set_verbosity_level()函数用于将模块级/全局变量(在我的现实生活中为程序包级变量)的值控制为0-4. CheckFile()函数在输入文件中执行测试(实际情况取决于类型).
我想根据详细程度在CheckFile()中打印消息.问题是argparse在Set_verbosity_level()之前调用CheckFile(),因此详细程度级别始终为0 /默认值在CheckFile中…

所以我的问题是是否有任何解决方案可以迫使argparse先评估一些论点…

  1. import argparse
  2. VERBOSITY = 0
  3. def Set_verbosity_level():
  4. """Set the verbosity level.
  5. """
  6. def type_func(value):
  7. a_value = int(value)
  8. globals()['VERBOSITY'] = value
  9. print("Verbosity inside Set_verbosity_level(): " + str(globals()['VERBOSITY']))
  10. return value
  11. return type_func
  12. class CheckFile(argparse.FileType):
  13. """
  14. Check whatever in the file
  15. """
  16. def __init__(self,mode='r',**kwargs):
  17. super(CheckFile,self).__init__(mode,**kwargs)
  18. def __call__(self,string):
  19. # Do whatever processing/checking/transformation
  20. # e.g print some message according to verbosity
  21. print("Verbosity inside CheckFile(): " + str(globals()['VERBOSITY']))
  22. return super(CheckFile,self).__call__(string)
  23. def make_parser():
  24. """The main argument parser."""
  25. parser = argparse.ArgumentParser(add_help=True)
  26. parser.add_argument("-V","--verbosity",default=0,type=Set_verbosity_level(),help="Increase output verbosity.",required=False)
  27. parser.add_argument('-i','--inputfile',help="Input file",type=CheckFile(mode='r'),required=True)
  28. return parser
  29. if __name__ == '__main__':
  30. myparser = make_parser()
  31. args = myparser.parse_args()
  32. print("Verbosity in Main: " + str(VERBOSITY))

调用此脚本将得到:

  1. $python test.py -i test.bed -V 2
  2. Verbosity inside CheckFile(): 0
  3. Verbosity inside Set_verbosity_level(): 2
  4. Verbosity in Main: 2
最佳答案
我不知道您可以强制首先读取argparse变量,但可以在主要功能中使用命令行解析器中内置的python:

  1. import sys
  2. # Your classes here #
  3. if __name__ == '__main__':
  4. verbosity = 0
  5. for i,sysarg in enumerate(sys.argv):
  6. if str(sysarg).strip().lower().replace('-','') in ['v','verbose']:
  7. try:
  8. verbosity = sys.argv[i + 1]
  9. except IndexError:
  10. print("No verbosity level specified")
  11. # more code

它不是很优雅,也不是argparse,但这是确保您首先获得详细信息的一种方法.

您还可以更新CheckFile类以包括详细检查功能

  1. class CheckFile(argparse.FileType):
  2. """
  3. Check whatever in the file
  4. """
  5. def __init__(self,**kwargs):
  6. super(CheckFile,**kwargs)
  7. def _check_verbosity(self):
  8. verbosity = 0
  9. for i,sysarg in enumerate(sys.argv):
  10. if str(sysarg).strip().lower().replace('-','verbose']:
  11. try:
  12. verbosity = sys.argv[i + 1]
  13. except IndexError:
  14. print("No verbosity level specified")
  15. return verbosity
  16. def __call__(self,string):
  17. # Do whatever processing/checking/transformation
  18. # e.g print some message according to verbosity
  19. print("Verbosity inside CheckFile(): {}".format(self._check_verbosity()))
  20. return super(CheckFile,self).__call__(string)

同样,我知道这并不是您的argparse问题的真正答案,但这是您的问题的解决方

猜你在找的Python相关文章