成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python的解釋器級別對象的實(shí)現(xiàn)方法

fredshare / 2718人閱讀

摘要:最近在重構(gòu)項(xiàng)目代碼有個(gè)需求是需要聲明一個(gè)變量然后任何了這個(gè)變量的模塊當(dāng)這個(gè)變量在其它地方更改了值以后這個(gè)變化都能反映出來乍看好像有點(diǎn)麻煩其實(shí)很簡單就通常的想法來講你用或一個(gè)類實(shí)例都能實(shí)現(xiàn)因?yàn)樵谑褂盟鼈儠r(shí)本質(zhì)上還是一種引用的方式而不是像其它變

最近在重構(gòu)項(xiàng)目代碼, 有個(gè)需求是需要聲明一個(gè)變量, 然后任何import了這個(gè)變量的模塊, 當(dāng)這個(gè)變量在其它地方更改了值以后, 這個(gè)變化都能反映出來, 乍看好像有點(diǎn)麻煩, 其實(shí)很簡單.

就通常的想法來講, 你用Dict, list或一個(gè)類實(shí)例都能實(shí)現(xiàn). 因?yàn)樵谑褂盟鼈儠r(shí), 本質(zhì)上還是一種引用的方式, 而不是像其它變量是值復(fù)制, 所以它們的修改或變化是肯定能反映出來的

比如tornado的options, 沒記錯(cuò)的話, 文檔里寫的什么解釋器級別變量, 很高端的樣子, 其實(shí)實(shí)現(xiàn)不難, 直接跳到代碼

options = OptionParser()
"""Global options object.

All defined options are available as attributes on this object.
"""

Global的對象, 因?yàn)?b>OptionParser的實(shí)例就一個(gè)options, 每次使用是怎么使用的呢

from tornado.options import options

每次都import的是這個(gè)實(shí)例, 而包括define在內(nèi)的函數(shù), 其實(shí)都是在對這個(gè)唯一的實(shí)例在進(jìn)行操作而已, 代碼中有這段

def define(name, default=None, type=None, help=None, metavar=None,
           multiple=False, group=None, callback=None):
    """Defines an option in the global namespace.

    See `OptionParser.define`.
    """
    return options.define(name, default=default, type=type, help=help,
                          metavar=metavar, multiple=multiple, group=group,
                          callback=callback)

另外一個(gè)令人容易想到的解釋器級別的東西就是logger, logging.getLogger()也是聲明解釋器級別的對象, 而且還是線程安全的. 我們只需要在某個(gè)模塊中聲明一個(gè)logger, 然后在其它模塊里

import logging

logger = logging.getLogger("xxname")

就行了

直接看代碼

def getLogger(self, name):
        """
        Get a logger with the specified name (channel name), creating it
        if it doesn"t yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn"t exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        """
        rv = None
        if not isinstance(name, basestring):
            raise TypeError("A logger name must be string or Unicode")
        if isinstance(name, unicode):
            name = name.encode("utf-8")
        _acquireLock()
        try:
            if name in self.loggerDict:
                rv = self.loggerDict[name]
                if isinstance(rv, PlaceHolder):
                    ph = rv
                    rv = (self.loggerClass or _loggerClass)(name)
                    rv.manager = self
                    self.loggerDict[name] = rv
                    self._fixupChildren(ph, rv)
                    self._fixupParents(rv)
            else:
                rv = (self.loggerClass or _loggerClass)(name)
                rv.manager = self
                self.loggerDict[name] = rv
                self._fixupParents(rv)
        finally:
            _releaseLock()
        return rv

這個(gè)getLogger函數(shù)最終調(diào)用的是Manager類的實(shí)例函數(shù)getLogger, 當(dāng)你用的這個(gè)name不存在時(shí), 通常是日志初始化時(shí), 會(huì)聲明一個(gè)Logger對象, 然后放到ManagerloggerDict中進(jìn)行管理.

當(dāng)你在別的地方也聲明了這個(gè)name的logger時(shí), Manager會(huì)發(fā)現(xiàn)loggerDict中已經(jīng)有了, 直接拿出來用就行了. 其中還包括一些日志層級, hierarchy那些東西的處理, 不過這不是本文重點(diǎn).

至于線程安全, 很簡單, 代碼里給加了線程鎖. 這樣打日志就不會(huì)東一塊西一塊了, 可惜多進(jìn)程的日志標(biāo)準(zhǔn)庫沒有給進(jìn)程安全的實(shí)現(xiàn), 當(dāng)然自己統(tǒng)一上傳用socket處理或者用個(gè)process queue處理都是可以的.

如果想在允許多次實(shí)例化的情況下, 實(shí)現(xiàn)這種解釋器級別變量呢?
那就是單例模式了, 在實(shí)例已經(jīng)存在時(shí)調(diào)用一個(gè)函數(shù)對自己進(jìn)行重載或更新即可

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38088.html

相關(guān)文章

  • 小李飛刀:ppppppython你好哇

    摘要:的被設(shè)定為裝飾器可以幫助我們檢查保證沒有重復(fù)值。錯(cuò)誤記錄等解釋器打印錯(cuò)誤棧的信息,程序也結(jié)束了。將通過配置記錄到日志文件中方便后續(xù)的排查。同理,指定后,和就不起作用了。啟動(dòng)的調(diào)試器,讓程序以單步方式運(yùn)行。 日常的寫在前面 難得的周末,有大段的時(shí)間可以用來學(xué)習(xí),體驗(yàn)就和工作日的晚上完全不一樣了。好好的沉下心學(xué)習(xí)下~即刻很喜歡了! 好好學(xué)習(xí)的分割線 打打打雞血!!!!!! 面向?qū)ο蟾呒壘幊?..

    greatwhole 評論0 收藏0
  • Python new 類方法和 init 實(shí)例方法以及單例模式簡單討論

    摘要:中的類都是單例模式一天,一同事問我這樣一個(gè)問題。與方法屬于新式類,即屬于類。方法在實(shí)例被創(chuàng)建之后被調(diào)用,該方法僅僅是對方法創(chuàng)建的實(shí)例進(jìn)行一些初始化操作。需要注意的是,在重寫方法與方法的參數(shù)應(yīng)該保持一致,否則會(huì)有發(fā)生。 Python 中的類都是單例模式? 一天,一同事問我這樣一個(gè)問題。這是一個(gè)奇怪的問題,可能你也這么認(rèn)為。這里先不做解釋,我們先來看看 __new__ 和 __init__...

    FingerLiu 評論0 收藏0
  • 【數(shù)據(jù)科學(xué)系統(tǒng)學(xué)習(xí)】Python # 數(shù)據(jù)分析基本操作[二] pandas

    摘要:中面向行和面向列的操作基本是平衡的。用層次化索引,將其表示為更高維度的數(shù)據(jù)。使用浮點(diǎn)值表示浮點(diǎn)和非浮點(diǎn)數(shù)組中的缺失數(shù)據(jù)。索引的的格式化輸出形式選取數(shù)據(jù)子集在內(nèi)層中進(jìn)行選取層次化索引在數(shù)據(jù)重塑和基于分組的操作中很重要。 我們在上一篇介紹了 NumPy,本篇介紹 pandas。 pandas入門 Pandas 是基于Numpy構(gòu)建的,讓以NumPy為中心的應(yīng)用變的更加簡單。 pandas...

    jayzou 評論0 收藏0
  • Python 面試」第二次更新

    摘要:結(jié)果為對于迭代器和生成器你知道哪些,它們分別應(yīng)用于什么場景先介紹什么是可迭代的任何可用于循環(huán)的都是可迭代的。示例結(jié)果為,迭代器任何可以使用函數(shù)的都是迭代器,也可使用函數(shù)將可迭代對象變?yōu)榈鳌N磳懲?,下次更新補(bǔ)上。 showImg(https://segmentfault.com/img/bVbuN3P); 閱讀本文大約需要 8 分鐘。 7.說一下 Python 中的裝飾器 原理:利用...

    Yu_Huang 評論0 收藏0
  • [譯] 從底層理解 Python 執(zhí)行

    摘要:接下來,我們將注入到函數(shù)的字節(jié)碼中。首先我們來看一下幀的參數(shù)所能提供的信息,如下所示當(dāng)前幀將執(zhí)行的當(dāng)前的操作中的字節(jié)碼字符串的索引經(jīng)過我們的處理我們可以得知之后要被執(zhí)行的操作碼,這對我們聚合數(shù)據(jù)并展示是相當(dāng)有用的。 原文鏈接: Understanding Python execution from inside: A Python assembly tracer 以下為譯文 最近...

    wmui 評論0 收藏0

發(fā)表評論

0條評論

fredshare

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<