簡體   English   中英

如何從子函數將模塊導入main()?

[英]How can I import a module into main() from a sub function?

在Python腳本中,我想控制模塊從子函數到main()的導入。 這可能嗎? 怎么樣?

原因:我有一個子函數來處理命令行參數(使用argparse),並希望基於用戶輸入導入模塊。 具體來說,我想讓用戶指定matplotlib的后端,必須在導入matplotlib.pylab之前對其進行設置。 但是,我認為這個問題具有更廣泛的用途。

這是一個代碼片段:

def main():

    args = handleCommandLine();

    fig, ax = plt.subplots(1)   # ERROR: plt not defined

    # Snip ...


def handleCommandLine():
    p = argparse.ArgumentParser()
    p.add_argument('--backend', '-b', default=None, help='Specify plotting backend')
    args = p.parse_args()

    if args.backend != None:
        matplotlib.use(args.backend)  #Must occur before importing pyplot

    import matplotlib.pyplot as plt   #Must occur after setting backend, if desired
    return args

如果您希望它的行為就像您在模塊頂部的import matplotlib.pyplot as plt一樣執行import matplotlib.pyplot as plt ,即使您沒有這樣做,也可以使用全局變量:

def handleCommandLine():
    p = argparse.ArgumentParser()
    p.add_argument('--backend', '-b', default=None, help='Specify plotting backend')
    args = p.parse_args()

    if args.backend != None:
        matplotlib.use(args.backend)  #Must occur before importing pyplot

    global plt  #Style choice: Can also be placed at the top of the function
    import matplotlib.pyplot as plt  #Must occur after setting backend
    return args

否則,可以像處理任何其他變量一樣,通過函數返回傳遞包含的庫引用:

def main():
    plt, args = handleCommandLine()   # CHANGED HERE
    fig, ax = plt.subplots(1)
    # ...    

def handleCommandLine():
    p = argparse.ArgumentParser()
    p.add_argument('--backend', '-b', default=None, help='Specify plotting backend')
    args = p.parse_args()

    if args.backend != None:
        matplotlib.use(args.backend)  #Must occur before importing pyplot

    import matplotlib.pyplot as plt   #Must occur after setting backend, if desired
    return plt, args   # CHANGED HERE

import語句非常類似於賦值-除非您顯式聲明為global ,否則它將分配給本地名稱。 以下進口plt到全局命名空間:

def handleCommandLine():
    global plt
    ...
    import matplotlib.pyplot as plt

你不能

我可以通過從handleCommandLine返回plt或將導入移動到main來解決此問題。

global plt放在handleCommandLine()的開頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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