如何处理具有许多可以从命令行调用或导入的参数的 Python 函数 def



在模块中创建可以从命令行调用或以编程方式导入和调用的函数时,使用标准python模块和技术处理大量参数的好方法是什么?

例如:

# my_thing.py
import argparse
def my_thing(
        param1=None, param2=None,
        param3=None, param4=None,
        param5=None, param6=None,
        param7=None, param8=None):
    # Do something with all those parameters
    pass
def main():
    parser = argparse.ArgumentParser()
    # add arguments
    args = parser.parse_args()
    my_thing(
        param1=args.param1, param2=args.param2,
        param3=args.param3, param4=args.param4,
        param5=args.param5, param6=args.param6,
        param7=args.param7, param8=args.param8):
if __name__ == "__main__":
    main()

或者也许这个...

# my_thing.py
import argparse
def my_thing(params):
    # Do something with all those parameters
    pass
def main():
    parser = argparse.ArgumentParser()
    # add arguments
    args = parser.parse_args()
    params = {
        "param1":args.param1, "param2":args.param2,
        "param3":args.param3, "param4":args.param4,
        "param5":args.param5, "param6":args.param6,
        "param7":args.param7, "param8":args.param8}
    my_thing(params)
if __name__ == "__main__":
    main()

这可能不是最好的方法,但您可以将所有参数存储在字典中,或将它们按列表排序。

#dictionary
def my_thing(dict):
    param_1 = dict['param_1']
    param_i = dict['param_i']
# list
def my_thing(list_of_param):
    param_1 = list_of_param[0]
    ...param_i = list_of_param[i]...

更好的方法是创建一个包装器对象来封装参数,但这些参数都无法真正帮助轻松创建新实例。

要快速创建新实例,将参数存储在.txt或.csv文件中并解析文件中的不同参数可能会有所帮助。这将使在命令行中运行变得容易,因为您可以轻松地将文件添加为参数之一。

python my_script.py my_parameters.txt

您实际上可以使用第三个选项,将parser.parse_args()返回的Namespace对象的 __dict__ 属性传递到 my_thing 中。 object.__dict__访问所有对象用于存储其属性的基础字典。在这种情况下,Namespace对象的属性是提供给脚本的命令行参数。

# my_thing.py
import argparse

def my_thing(params):
    print(params)

def main():
    parser = argparse.ArgumentParser()
    # add arguments
    args = parser.parse_args()
    my_thing(args.__dict__)

if __name__ == "__main__":
    main()

使用仅关键字参数怎么样?

例如:

import argparse
def my_thing(*, param1, param2, param3):
    # Do something with all those parameters
    pass
def main():
    parser = argparse.ArgumentParser()
    # add arguments
    args = parser.parse_args()
    # see https://stackoverflow.com/q/16878315/5220128
    my_thing(**vars(args))
if __name__ == "__main__":
    main()

最新更新