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