[英]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.