我有 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 参数。有办法吗?
最佳答案
就像我的评论和 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)
关于python - 从外部模块访问 argparse 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41322486/