从外部模块访问 argparse 变量

Access argparse variables from external module

我有 4 个模块:

我在 utils.py 中使用了 argparse,我希望能够在 client.py 中检索其中一个参数的值。

我不想将 url 作为参数传递给 client.get_user_info(),因为我认为将它作为该函数的参数不是很好。

所以我希望能够直接检索我从 utils.parse_arguments() 获得的 argparse 参数。有办法吗?

创建一个新模块console_args.py:

"""
Parsing of command line arguments.

No other functionality should be added to this module.
The typically usage is:

>>> from console_args import CONSOLE_ARGS 
"""

def _parse_arguments():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        # Several arguments, one of which should be 'url'
    )
    return parser.parse_args()

CONSOLE_ARGS =  _parse_arguments()

# optional: delete function after use to prevent calling from other place
del _parse_arguments

现在你在所有模块中使用它:

from console_args import CONSOLE_ARGS

函数_parse_arguments()只会执行一次。 Python 中的模块是单例,即它们只会在第一次导入时执行。 每个后续导入都将获得一个模块对象,而无需执行整个导入过程,再次执行所有模块级代码。

_parse_arguments()中的下划线表示该函数不应该在模块console_args.py之外使用。 在 _parse_arguments 被调用后删除 _parse_arguments 将阻止在程序的 运行 时间内对 _parse_arguments() 的任何其他调用(只要不应用重新加载技巧)。

就像我的评论和 Mike Müller 的回答中的建议一样,下面的代码设置了一个模块级变量。
但是,为了防止在导入时解析参数,我只在调用 parse_arguments 时设置变量。由于在此之前变量设置为 None,因此我也只在需要时导入变量。
这样, parse_arguments 只有在你调用它时才 运行 ,而不是在你导入模块时。在您的特定情况下可能不需要它,但在例如包中使用了像 utils 这样的模块。

utils.py:

CONSOLE_ARGUMENTS = None

def parse_arguments():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        # Several arguments, one of which should be 'url'
    )
     parser.parse_args()
    global CONSOLE_ARGUMENTS
    CONSOLE_ARGUMENTS = parser.parse_args()
    return CONSOLE_ARGUMENTS

client.py:

def _compose_url(method):
    from .utils import CONSOLE_ARGUMENTS
    base_url = CONSOLE_ARGUMENTS.base_url
    return base_url + str(method)