我们以下面的例子为例。解析器包含两个参数--输入文件和详细信息。Set_verbosity_level()函数用于控制模块级/全局变量(在我的实际生活中是包级变量)的值为0-4。CheckFile()函数在输入文件中执行测试(在现实生活中取决于类型)。我希望根据详细程度在CheckFile()中打印消息。问题是,argparse在调用Set_verbosity_level()之前调用CheckFile(),因此在CheckFile中,详细级别始终为0/default ...
因此,我的问题是,是否有任何解决方案来强制argparse在评估某些参数之前评估其他参数……
import argparse
VERBOSITY = 0
def Set_verbosity_level():
"""Set the verbosity level.
"""
def type_func(value):
a_value = int(value)
globals()['VERBOSITY'] = value
print("Verbosity inside Set_verbosity_level(): " + str(globals()['VERBOSITY']))
return value
return type_func
class CheckFile(argparse.FileType):
"""
Check whatever in the file
"""
def __init__(self, mode='r', **kwargs):
super(CheckFile, self).__init__(mode, **kwargs)
def __call__(self, string):
# Do whatever processing/checking/transformation
# e.g print some message according to verbosity
print("Verbosity inside CheckFile(): " + str(globals()['VERBOSITY']))
return super(CheckFile, self).__call__(string)
def make_parser():
"""The main argument parser."""
parser = argparse.ArgumentParser(add_help=True)
parser.add_argument("-V",
"--verbosity",
default=0,
type=Set_verbosity_level(),
help="Increase output verbosity.",
required=False)
parser.add_argument('-i', '--inputfile',
help="Input file",
type=CheckFile(mode='r'),
required=True)
return parser
if __name__ == '__main__':
myparser = make_parser()
args = myparser.parse_args()
print("Verbosity in Main: " + str(VERBOSITY))调用此脚本可实现以下功能:
$python test.py -i test.bed -V 2
Verbosity inside CheckFile(): 0
Verbosity inside Set_verbosity_level(): 2
Verbosity in Main: 2发布于 2019-03-30 01:30:38
我不知道您是否可以强制先读取argparse变量,但您可以在main函数中使用内置在命令行解析器中的python:
import sys
# Your classes here #
if __name__ == '__main__':
verbosity = 0
for i, sysarg in enumerate(sys.argv):
if str(sysarg).strip().lower().replace('-','') in ['v', 'verbose']:
try:
verbosity = sys.argv[i + 1]
except IndexError:
print("No verbosity level specified")
# more code它不是很优雅,也不是argparse,但它是一种确保你首先获得冗长的方法。
您还可以更新您的CheckFile类以包含详细检查函数:
class CheckFile(argparse.FileType):
"""
Check whatever in the file
"""
def __init__(self, mode='r', **kwargs):
super(CheckFile, self).__init__(mode, **kwargs)
def _check_verbosity(self):
verbosity = 0
for i, sysarg in enumerate(sys.argv):
if str(sysarg).strip().lower().replace('-','') in ['v', 'verbose']:
try:
verbosity = sys.argv[i + 1]
except IndexError:
print("No verbosity level specified")
return verbosity
def __call__(self, string):
# Do whatever processing/checking/transformation
# e.g print some message according to verbosity
print("Verbosity inside CheckFile(): {}".format(self._check_verbosity()))
return super(CheckFile, self).__call__(string)我再说一次,我知道这不是对argparse问题的真正回答,但它是您问题的解决方案
发布于 2019-03-30 01:54:00
argparse按照命令行参数的列出顺序处理命令行参数,因此,如果您只是交换给定选项的顺序,它将以您想要的详细程度输出:
python test.py -V 2 -i test.bed这将输出以下内容:
Verbosity inside Set_verbosity_level(): 2
Verbosity inside CheckFile(): 2没有其他方法可以告诉argparse以与命令行参数的列出顺序不同的顺序处理命令行参数。
https://stackoverflow.com/questions/55422008
复制相似问题