我的许多python模块都接受相同的输入参数

时间:2019-12-09 23:49:24

标签: python argparse

我正在处理一个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

但这似乎是一种混乱的方式。

1 个答案:

答案 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')