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

时间:2018-01-04 18:10:27

标签: python parameters

使用标准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()

3 个答案:

答案 0 :(得分:0)

这可能不是最佳方式,但您可以将所有参数存储在字典中,或者在列表中对它们进行排序。

#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

答案 1 :(得分:0)

您实际上可以使用第三个选项,将__dict__返回的Namespace对象的parser.parse_args()属性传递到my_thingobject.__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()

答案 2 :(得分:0)

如何使用仅限关键字参数?

例如:

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()