繁体   English   中英

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

[英]How to handle Python function def with many parameters that can be called from command line or imported?

在可从命令行调用或以编程方式导入和调用的模块中创建函数时,使用标准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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM