Re: [問題] 限制某個function只能被叫到一次

看板Python作者 (謊言接線生)時間3年前 (2021/03/16 10:48), 3年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
※ 引述《MaR1nlolz (mumimumi)》之銘言: : 最近遇到個問題,請問一下各位, : 當執行python app.py時,不論MongoClient()被呼叫幾次,我希望create()只被呼叫一次 : , : 我目前的做法是透過global variable來判斷 : create()是否被呼叫過,不過global variable用法幾乎都不太建議使用, : 避免被其他地方改到,想請問各位有沒有比較好的做法,以下是我的程式碼,謝謝 我覺得根本問題是你的使用方式出了問題: 1. instance本質上也不應該global使用 2. 你這段Code裡面有過多不必要的包裝 先跳過問題1。針對問題2,你會發現這裡的isInit == False幾乎等價於 instance is None(除非很例外的情況導致MongoClient傳回None),也就是這是多 餘的邏輯包裝。最簡單的方式是: --- mongo.py from pymongo import MongoClient instance = None def create(): if instance is None: instance = MongoClient( 'mongo://127.0.0.1:27017', maxPoolSize=10 ) --- app.py import mongo mongo.create() # 之後拿 mongo.instance 來運用 mongo.create() # 重複呼叫create()會因為instance已經不是None而不會做任何事 事實上我想不太到為什麼會導致重複create的狀態,照理說程式應該開頭create 一次後就只用create好的實體,除非斷線否則再也不會呼叫第二次create才對。你如 果把問題一也解決,就會發現連create(或者說整個mongo.py)都是多餘包裝。 : --- mongo.py : instance = None : isInit = False : def create(): : mogno = MongoClient('mongo://127.0.0.1:27017', maxPoolSize=10) : return mogno : def mongoClient(): : global isInit, instance : if isInit == False: : instance = create() : isInit = True : --- app.py : import mongoClient : mongoClient() : mongoClient() : mongoClient() -- 「傳說的最後,魔王總是被勇者封印。但勇者會逝去、封印會衰弱,魔王卻永遠 不滅。傳說呢?傳說持續著。只是,變質了。所以對於傳說而言,只有反覆無常的自 己是主角,而魔王只是配角。勇者?勇者不過是消耗品罷了,封印則什麼也不是。妳 好不容易有機會當上配角,怎麼走回頭路想成為消耗品?妳早晚會什麼也不是的。」 --星.幻.夢的傳說 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 8.37.43.216 (美國) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1615862895.A.983.html ※ 編輯: ddavid (8.37.43.216 美國), 03/16/2021 13:38:37
文章代碼(AID): #1WK1nlc3 (Python)
文章代碼(AID): #1WK1nlc3 (Python)