我正在处理一个python项目,在该项目中,我制作了许多不同的文件,这些文件应从命令行调用并使用argparse。大多数(但不是全部)模块共享许多重复的输入参数。目前,我的模块的主菜单如下所示:
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--db', dest='database', action='store', required=True,
choices=['test_db', 'production'], help='Choose which database to use.')
parser.add_argument('-a', '--analysis-date', dest='analysis_date', action='store', required=True,
help='Date to analyze, format: MM-DD-YYYY')
parser.add_argument('-s', '--skip-data', dest='skip_data', action='store_true',
required=False, help='Skip all downloads and parsing.')
args = parser.parse_args()
call_some_function(args)
对于这个模块来说效果很好,但是我还有〜10个以上的模块,它们接受许多相同的输入参数。 (请记住,每个模块都没有共享任何输入)
我的问题:不必在每个主变量中都定义这些参数,而是有一种Python方式将它们全部定义一次,然后在需要时从每个main
中调用它们吗?
我可以有一个带有一堆if语句的python文件,即:
def create_parser(db=False, analysis_date=False, skip_data=False):
parser = argparse.ArgumentParser()
if db:
parser.add_argument('--db', dest='database', action='store', required=True,
choices=['test_db', 'production'], help='Choose which database to use.')
if analysis_date:
parser.add_argument('-a', '--analysis-date', dest='analysis_date', action='store', required=True,
help='Date to analyze, format: MM-DD-YYYY')
if skip_data:
parser.add_argument('-s', '--skip-data', dest='skip_data', action='store_true',
required=False, help='Skip all downloads and parsing.')
return parser
但这似乎是一种混乱的方式。
答案 0 :(得分:0)
我认为您可以创建一个Class并处理所有参数以防止产生意大利面条式代码。 另外,您可以传递一个“ config”元组,其中包含所需参数的名称。
import argparse
class Argument:
def __init__(self, long_flag=None, dest=None, action=None, required=False):
self.long_flag = long_flag
self.optional_arguments = {
'dest': dest,
'action': action,
'required': required,
}
def create_parser(*config):
parser = argparse.ArgumentParser()
# Each new argument requires only one new line, DRY!
arguments_dictionary = {
'--db': Argument(None, 'database', 'store' , True),
'-a': Argument('--analysis-date', 'database', 'store', True),
}
for argument in config:
config_instance = arguments_dictionary[argument]
positional_arguments = [argument]
if config_instance.long_flag:
positional_arguments.append(config_instance.long_flag)
parser.add_argument(*positional_arguments, **config_instance.optional_arguments)
return parser
parser = create_parser('--db', '-a')