簡體   English   中英

從外部模塊訪問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()任何其他調用(只要不應用重載技巧)。

就像我的評論和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM