国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關于Python not 及is None的有趣現象

NikoManiac / 3150人閱讀

摘要:最近碰到一個問題就是查看相關源碼的時候。題外話于是魯主開啟了第一次提問之旅。尷尬,沒關系,大膽承認自己是菜鳥就了。也并不代表對象沒有其他屬性。它只是代表該對象作為時為空。

最近碰到一個問題,就是查看flask SessionInterface相關源碼的時候。比如我想整合redis作為flask session的存儲。參考:http://flask.pocoo.org/snippe...此處代碼中發現以下代碼片段特別困惑:

 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 然后又在里面調用session.sid。想了半天沒想通,但是心里又想官方代碼片段肯定不會太馬虎的,一定有其道理。

題外話:于是魯主開啟了第一次stactoverflow提問之旅。(以前都是只在上面尋找答案,無奈這次沒找到,可能是問題太過幼稚了吧。尷尬,沒關系,大膽承認自己是菜鳥就ok了。)
問題鏈接:http://stackoverflow.com/ques...
還真有牛人為我解答了。感覺還是很興奮的。

問題的來源在于這里的session對象對應的類繼承了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

而當dict為空的時候,比如if not {}: 這個時候條件判斷是出于True的狀態。
但是這個session還有其他的非dict屬性,如sid,還是可以正常訪問的。

寫個簡單的例子:

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")

運行之后輸出:
not a
aa

總之dict為空時,not dict就是True,但并不代表該dict對象沒有定義。也并不代表對象沒有其他屬性。它只是代表該session對象作為dict時為空。僅此而已。
如果要看對象是否定義,就一定要使用 is None來判斷。

那么還剩一個問題?
既然RedisSession(CallbackDict, SessionMixin),那么它既是CallbackDict的子類,not 空dict時返回True ,那么not 定義好的SessionMixin對象應該是False那么如何取舍呢?具體實現原理不知道,猜想可能是 True or False這樣形式在內部返回判斷結果的。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/38257.html

相關文章

  • Python對象身份迷思:從全體公民到萬物皆數

    摘要:真正的前方高能第一個鋪墊告訴我們,對象可以映射成布爾值真假,第二個鋪墊告訴我們,布爾值可以映射成數字和。得知布爾值和有這一層隱秘的身份,我已興奮不已,再難對這看似不合現代語境卻又流傳千古的思想做出任何揣測。 這么久以來,我終于確認了一件事,那就是不管是人也好,還是貓也好,常常會忘了想自己當下的身份位置,以及曾經的身份位置。 這個現象在我身上,表現出了雙倍分量的嚴重。這種時刻,我就會想起...

    xzavier 評論0 收藏0
  • Python對象身份迷思:從全體公民到萬物皆數

    摘要:真正的前方高能第一個鋪墊告訴我們,對象可以映射成布爾值真假,第二個鋪墊告訴我們,布爾值可以映射成數字和。得知布爾值和有這一層隱秘的身份,我已興奮不已,再難對這看似不合現代語境卻又流傳千古的思想做出任何揣測。 這么久以來,我終于確認了一件事,那就是不管是人也好,還是貓也好,常常會忘了想自己當下的身份位置,以及曾經的身份位置。 這個現象在我身上,表現出了雙倍分量的嚴重。這種時刻,我就會想起...

    chunquedong 評論0 收藏0
  • Python 魔術方法做出更好正則表達式 API

    摘要:注原文地址為我的一個同事提到他錯過了的正則表達式的語法糖。首先,從正則表達式檢索捕捉組需要兩個步驟。語法糖為了好玩,我把一個小小的增加了一些語法糖的正則表達式庫的幫助類放在一起。調用將調用類的方法。 注:原文地址為 Playing with Python Magic Methods to make a nicer Regex API 我的一個同事提到,他錯過了 Ruby 的正...

    MangoGoing 評論0 收藏0
  • Python實用技法第33篇:字符串連接合并

    摘要:上一篇文章實用技法第篇對齊文本字符串下一篇文章問題我們想將許多小字符串合并成一個大的字符串。示例如下對于不必要的字符串連接操作也要引起重視。有時候在技術上并非必需的時候,程序員們也會忘乎所以地使用字符串連接操作。 上一篇文章: Python實用技法第32篇:對齊文本字符串下一篇文章:  問題 我們想將許多小字符串合并成一個大的字符串。  解決方案 如果想要合并的字符串在一個序列或可迭代...

    JayChen 評論0 收藏0

發表評論

0條評論

NikoManiac

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<