[英]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()
任何其他調用(只要不應用重載技巧)。
就像我的評論和MikeMü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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.