从外部模块访问 argparse 变量
Access argparse variables from external module
我有 4 个模块:
entry_point.py
utils.py
runner.py
client.py
我在 utils.py
中使用了 argparse
,我希望能够在 client.py
中检索其中一个参数的值。
入口点模块(从控制台调用的模块):
import utils
def main():
console_args = utils.parse_arguments() # Get command-line arguments
runner.run(console_args) # The main function in the program
if __name__ == '__main__':
main()
utils.py
模块:
def parse_arguments():
parser = argparse.ArgumentParser()
parser.add_argument(
# Several arguments, one of which should be 'url'
)
return parser.parse_args()
runner.py
模块:
import client
def run(arguments):
user = User.new(arguments.user_id)
client.get_user_info(user)
client.py
模块:
def get_user_info(user):
url = _compose_url('user_status')
resp = requests.post(url, data=user.id)
def _compose_url(method):
# TODO: get base_url from console arguments
# base_url = ?
return base_url + str(method)
我不想将 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)
我有 4 个模块:
entry_point.py
utils.py
runner.py
client.py
我在 utils.py
中使用了 argparse
,我希望能够在 client.py
中检索其中一个参数的值。
入口点模块(从控制台调用的模块):
import utils def main(): console_args = utils.parse_arguments() # Get command-line arguments runner.run(console_args) # The main function in the program if __name__ == '__main__': main()
utils.py
模块:def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument( # Several arguments, one of which should be 'url' ) return parser.parse_args()
runner.py
模块:import client def run(arguments): user = User.new(arguments.user_id) client.get_user_info(user)
client.py
模块:def get_user_info(user): url = _compose_url('user_status') resp = requests.post(url, data=user.id) def _compose_url(method): # TODO: get base_url from console arguments # base_url = ? return base_url + str(method)
我不想将 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)