摘要:最近碰到一個(gè)問題就是查看相關(guān)源碼的時(shí)候。題外話于是魯主開啟了第一次提問之旅。尷尬,沒關(guān)系,大膽承認(rèn)自己是菜鳥就了。也并不代表對(duì)象沒有其他屬性。它只是代表該對(duì)象作為時(shí)為空。
最近碰到一個(gè)問題,就是查看flask SessionInterface相關(guān)源碼的時(shí)候。比如我想整合redis作為flask session的存儲(chǔ)。參考:http://flask.pocoo.org/snippe...此處代碼中發(fā)現(xiàn)以下代碼片段特別困惑:
def save_session(self, app, session, response): domain = self.get_cookie_domain(app) if not session: self.redis.delete(self.prefix + session.sid) if session.modified: response.delete_cookie(app.session_cookie_name, domain=domain) return
后來我又查看了flask的SecureSessionInterface,也是類似這樣的。
if not session: self.redis.delete(self.prefix + session.sid) if session.modified: response.delete_cookie(app.session_cookie_name, domain=domain) return
if not session 然后又在里面調(diào)用session.sid。想了半天沒想通,但是心里又想官方代碼片段肯定不會(huì)太馬虎的,一定有其道理。
題外話:于是魯主開啟了第一次stactoverflow提問之旅。(以前都是只在上面尋找答案,無奈這次沒找到,可能是問題太過幼稚了吧。尷尬,沒關(guān)系,大膽承認(rèn)自己是菜鳥就ok了。)
問題鏈接:http://stackoverflow.com/ques...
還真有牛人為我解答了。感覺還是很興奮的。
問題的來源在于這里的session對(duì)象對(duì)應(yīng)的類繼承了dict,代碼如下:
class RedisSession(CallbackDict, SessionMixin): def __init__(self, initial=None, sid=None, new=False): def on_update(self): self.modified = True CallbackDict.__init__(self, initial, on_update) self.sid = sid self.new = new self.modified = False
而當(dāng)dict為空的時(shí)候,比如if not {}: 這個(gè)時(shí)候條件判斷是出于True的狀態(tài)。
但是這個(gè)session還有其他的非dict屬性,如sid,還是可以正常訪問的。
寫個(gè)簡(jiǎn)單的例子:
class AA(dict): def __init__(self,name): self.name=name super(AA,self).__init__() a=AA("aa") if not a: print("not a") print(a.name) if a is None: print("a is None")
運(yùn)行之后輸出:
not a
aa
總之dict為空時(shí),not dict就是True,但并不代表該dict對(duì)象沒有定義。也并不代表對(duì)象沒有其他屬性。它只是代表該session對(duì)象作為dict時(shí)為空。僅此而已。
如果要看對(duì)象是否定義,就一定要使用 is None來判斷。
那么還剩一個(gè)問題?
既然RedisSession(CallbackDict, SessionMixin),那么它既是CallbackDict的子類,not 空dict時(shí)返回True ,那么not 定義好的SessionMixin對(duì)象應(yīng)該是False那么如何取舍呢?具體實(shí)現(xiàn)原理不知道,猜想可能是 True or False這樣形式在內(nèi)部返回判斷結(jié)果的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/38257.html
摘要:真正的前方高能第一個(gè)鋪墊告訴我們,對(duì)象可以映射成布爾值真假,第二個(gè)鋪墊告訴我們,布爾值可以映射成數(shù)字和。得知布爾值和有這一層隱秘的身份,我已興奮不已,再難對(duì)這看似不合現(xiàn)代語(yǔ)境卻又流傳千古的思想做出任何揣測(cè)。 這么久以來,我終于確認(rèn)了一件事,那就是不管是人也好,還是貓也好,常常會(huì)忘了想自己當(dāng)下的身份位置,以及曾經(jīng)的身份位置。 這個(gè)現(xiàn)象在我身上,表現(xiàn)出了雙倍分量的嚴(yán)重。這種時(shí)刻,我就會(huì)想起...
摘要:真正的前方高能第一個(gè)鋪墊告訴我們,對(duì)象可以映射成布爾值真假,第二個(gè)鋪墊告訴我們,布爾值可以映射成數(shù)字和。得知布爾值和有這一層隱秘的身份,我已興奮不已,再難對(duì)這看似不合現(xiàn)代語(yǔ)境卻又流傳千古的思想做出任何揣測(cè)。 這么久以來,我終于確認(rèn)了一件事,那就是不管是人也好,還是貓也好,常常會(huì)忘了想自己當(dāng)下的身份位置,以及曾經(jīng)的身份位置。 這個(gè)現(xiàn)象在我身上,表現(xiàn)出了雙倍分量的嚴(yán)重。這種時(shí)刻,我就會(huì)想起...
摘要:注原文地址為我的一個(gè)同事提到他錯(cuò)過了的正則表達(dá)式的語(yǔ)法糖。首先,從正則表達(dá)式檢索捕捉組需要兩個(gè)步驟。語(yǔ)法糖為了好玩,我把一個(gè)小小的增加了一些語(yǔ)法糖的正則表達(dá)式庫(kù)的幫助類放在一起。調(diào)用將調(diào)用類的方法。 注:原文地址為 Playing with Python Magic Methods to make a nicer Regex API 我的一個(gè)同事提到,他錯(cuò)過了 Ruby 的正...
摘要:上一篇文章實(shí)用技法第篇對(duì)齊文本字符串下一篇文章問題我們想將許多小字符串合并成一個(gè)大的字符串。示例如下對(duì)于不必要的字符串連接操作也要引起重視。有時(shí)候在技術(shù)上并非必需的時(shí)候,程序員們也會(huì)忘乎所以地使用字符串連接操作。 上一篇文章: Python實(shí)用技法第32篇:對(duì)齊文本字符串下一篇文章: 問題 我們想將許多小字符串合并成一個(gè)大的字符串。 解決方案 如果想要合并的字符串在一個(gè)序列或可迭代...
閱讀 3318·2019-08-29 16:17
閱讀 1975·2019-08-29 15:31
閱讀 2645·2019-08-29 14:09
閱讀 2548·2019-08-26 13:52
閱讀 744·2019-08-26 12:21
閱讀 2125·2019-08-26 12:08
閱讀 991·2019-08-23 17:08
閱讀 1922·2019-08-23 16:59