作者ddavid (谎言接线生)
看板Python
标题Re: [问题] 限制某个function只能被叫到一次
时间Tue Mar 16 10:48:12 2021
※ 引述《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://webptt.com/cn.aspx?n=bbs/Python/M.1615862895.A.983.html
※ 编辑: ddavid (8.37.43.216 美国), 03/16/2021 13:38:37