如何从不同的子模块

时间:2015-05-05 16:39:00

标签: python

我最近一直在开发一个python包,发现我需要访问从我的主脚本中删除许多脚本的命令行参数。 为了保持对原始命令行参数的轻松访问,我一直使用argparse来处理命令行,然后使用

保存命令行参数字典。
import argparse
import json

parser = argparse.ArgumentParser()

# parser.add_argument() stuff here

args   = parser.parse_args()
with open('commandLineArgs.json','w') as outfile:
    json.dump(args.__dict__,outfile)

然后,文件“commandLineArgs.json”可供我稍后添加的任何脚本使用,我不必将参数从文件传递到文件。

我觉得有一种更多的Pythonic方法可以做到这一点(甚至是argparse的一种方法,我没有找到)。有没有人知道更好的(即更多Pythonic)方法呢?

======

作为参考,我的python包结构松散(现在其他用户正在添加suboptionX.py文件):

/main.py

  • /option1.py#基于命令行参数

    • /sub_option1.py#基于option1的命令行参数

    • /sub_option2.py

  • /option2.py等

1 个答案:

答案 0 :(得分:2)

命令行参数用于自上而下的方法:参数提供给入口点函数(通常称为main),它处理参数,然后通过向子函数提供必需的参数来调用子函数

在您的情况下,您似乎希望您的脚本以相反的方式工作:每个模块独立于父模块,并且每个模块都需要访问所需的参数而不由父模块集中。在这种情况下,配置文件是可行的方法,因此任何子模块或下标都可以访问整个参数集而无需修改main()入口点。如果您的子模块使用非常不同的参数集,那么从长远来看,这也更具可读性和可管理性,因为相关参数将由相关子模块直接管理,而不是由包含main()的顶层模块管理。

根据您的描述,您似乎只是从命令行参数创建配置文件,这看起来有点多余。您可以将所有命令行参数移动到json解析器,并邀请您的用户自己设置配置文件。然后,唯一需要的命令行参数将是配置文件的位置。

这是我通过创建ConfigParser类来管理从配置文件加载的类似需求(许多子模块必须访问不同的,可能是所有参数)时所做的,并且我使所有子模块继承了配置文件通过子类化加载ConfigParser的父类。参见:

使用这种方案,通过继承Base类,所有子类也可以访问所有配置参数,无需任何显式操作,也没有任何内存开销(因为它只是一个引用,配置不是' t为每个子类重复)。例如,如果模块complex_math_func需要一个名为sigma的参数,则可以在模块定义中写入:

sigma = self.config.get("sigma")

这将自动从配置文件加载变量sigma,如果它不存在,它将只返回None,以便您可以设置默认值。子模块不必再进行任何用户输入/参数处理,因为它由ConfigParser + Base类自动管理。