最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實用代碼片段收集貼

 更新時間:2015年06月03日 09:22:09   投稿:junjie  
這篇文章主要介紹了python實用代碼片段收集貼,本文收集了如獲取一個類的所有子類、計算運行時間、SQLAlchemy簡單使用、實現(xiàn)類似Java或C中的枚舉等實用功能代碼,需要的朋友可以參考下

獲取一個類的所有子類

復制代碼 代碼如下:

def itersubclasses(cls, _seen=None):
    """Generator over all subclasses of a given class in depth first order."""
    if not isinstance(cls, type):
        raise TypeError(_('itersubclasses must be called with '
                          'new-style classes, not %.100r') % cls)
    _seen = _seen or set()
    try:
        subs = cls.__subclasses__()
    except TypeError:   # fails only when cls is type
        subs = cls.__subclasses__(cls)
    for sub in subs:
        if sub not in _seen:
            _seen.add(sub)
            yield sub
            for sub in itersubclasses(sub, _seen):
                yield sub

簡單的線程配合

復制代碼 代碼如下:

import threading
is_done = threading.Event()
consumer = threading.Thread(
    target=self.consume_results,
    args=(key, self.task, runner.result_queue, is_done))
consumer.start()
self.duration = runner.run(
        name, kw.get("context", {}), kw.get("args", {}))
is_done.set()
consumer.join() #主線程堵塞,直到consumer運行結(jié)束

多說一點,threading.Event()也可以被替換為threading.Condition(),condition有notify(), wait(), notifyAll()。解釋如下:
復制代碼 代碼如下:

The wait() method releases the lock, and then blocks until it is awakened by a notify() or notifyAll() call for the same condition variable in another thread. Once awakened, it re-acquires the lock and returns. It is also possible to specify a timeout.
The notify() method wakes up one of the threads waiting for the condition variable, if any are waiting. The notifyAll() method wakes up all threads waiting for the condition variable.
Note: the notify() and notifyAll() methods don't release the lock; this means that the thread or threads awakened will not return from their wait() call immediately, but only when the thread that called notify() or notifyAll() finally relinquishes ownership of the lock.

復制代碼 代碼如下:

# Consume one item
cv.acquire()
while not an_item_is_available():
    cv.wait()
get_an_available_item()
cv.release()
# Produce one item
cv.acquire()
make_an_item_available()
cv.notify()
cv.release()

計算運行時間

復制代碼 代碼如下:

class Timer(object):
    def __enter__(self):
        self.error = None
        self.start = time.time()
        return self
    def __exit__(self, type, value, tb):
        self.finish = time.time()
        if type:
            self.error = (type, value, tb)
    def duration(self):
        return self.finish - self.start
with Timer() as timer:
    func()
return timer.duration()

元類

__new__()方法接收到的參數(shù)依次是:
當前準備創(chuàng)建的類的對象;
類的名字;
類繼承的父類集合;
類的方法集合;

復制代碼 代碼如下:

class ModelMetaclass(type):
    def __new__(cls, name, bases, attrs):
        if name=='Model':
            return type.__new__(cls, name, bases, attrs)
        mappings = dict()
        for k, v in attrs.iteritems():
            if isinstance(v, Field):
                print('Found mapping: %s==>%s' % (k, v))
                mappings[k] = v
        for k in mappings.iterkeys():
            attrs.pop(k)
        attrs['__table__'] = name # 假設(shè)表名和類名一致
        attrs['__mappings__'] = mappings # 保存屬性和列的映射關(guān)系
        return type.__new__(cls, name, bases, attrs)
class Model(dict):
    __metaclass__ = ModelMetaclass
    def __init__(self, **kw):
        super(Model, self).__init__(**kw)
    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Model' object has no attribute '%s'" % key)
    def __setattr__(self, key, value):
        self[key] = value
    def save(self):
        fields = []
        params = []
        args = []
        for k, v in self.__mappings__.iteritems():
            fields.append(v.name)
            params.append('?')
            args.append(getattr(self, k, None))
        sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params))
        print('SQL: %s' % sql)
        print('ARGS: %s' % str(args))
class Field(object):
    def __init__(self, name, column_type):
        self.name = name
        self.column_type = column_type
    def __str__(self):
        return '<%s:%s>' % (self.__class__.__name__, self.name)
class StringField(Field):
    def __init__(self, name):
        super(StringField, self).__init__(name, 'varchar(100)')
class IntegerField(Field):
    def __init__(self, name):
        super(IntegerField, self).__init__(name, 'bigint')
class User(Model):
    # 定義類的屬性到列的映射:
    id = IntegerField('id')
    name = StringField('username')
    email = StringField('email')
    password = StringField('password')
# 創(chuàng)建一個實例:
u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd')
# 保存到數(shù)據(jù)庫:
u.save()

輸出如下:

復制代碼 代碼如下:

Found model: User
Found mapping: email ==> <StringField:email>
Found mapping: password ==> <StringField:password>
Found mapping: id ==> <IntegerField:uid>
Found mapping: name ==> <StringField:username>
SQL: insert into User (password,email,username,uid) values (?,?,?,?)
ARGS: ['my-pwd', 'test@orm.org', 'Michael', 12345]

SQLAlchemy簡單使用

復制代碼 代碼如下:

# 導入:
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 創(chuàng)建對象的基類:
Base = declarative_base()
# 定義User對象:
class User(Base):
    # 表的名字:
    __tablename__ = 'user'
    # 表的結(jié)構(gòu):
    id = Column(String(20), primary_key=True)
    name = Column(String(20))
# 初始化數(shù)據(jù)庫連接:
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test') # '數(shù)據(jù)庫類型+數(shù)據(jù)庫驅(qū)動名稱://用戶名:口令@機器地址:端口號/數(shù)據(jù)庫名'
# 創(chuàng)建DBSession類型:
DBSession = sessionmaker(bind=engine)
# 創(chuàng)建新User對象:
new_user = User(id='5', name='Bob')
# 添加到session:
session.add(new_user)
# 提交即保存到數(shù)據(jù)庫:
session.commit()
# 創(chuàng)建Query查詢,filter是where條件,最后調(diào)用one()返回唯一行,如果調(diào)用all()則返回所有行:
user = session.query(User).filter(User.id=='5').one()
# 關(guān)閉session:
session.close()

WSGI簡單使用和Web框架Flask的簡單使用

復制代碼 代碼如下:

from wsgiref.simple_server import make_server
def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, web!</h1>'
# 創(chuàng)建一個服務(wù)器,IP地址為空,端口是8000,處理函數(shù)是application:
httpd = make_server('', 8000, application)
print "Serving HTTP on port 8000..."
# 開始監(jiān)聽HTTP請求:
httpd.serve_forever()

了解了WSGI框架,我們發(fā)現(xiàn):其實一個Web App,就是寫一個WSGI的處理函數(shù),針對每個HTTP請求進行響應(yīng)。
但是如何處理HTTP請求不是問題,問題是如何處理100個不同的URL。
一個最簡單和最土的想法是從environ變量里取出HTTP請求的信息,然后逐個判斷。

復制代碼 代碼如下:

from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
    return '<h1>Home</h1>'
@app.route('/signin', methods=['GET'])
def signin_form():
    return '''<form action="/signin" method="post">
              <p><input name="username"></p>
              <p><input name="password" type="password"></p>
              <p><button type="submit">Sign In</button></p>
              </form>'''
@app.route('/signin', methods=['POST'])
def signin():
    # 需要從request對象讀取表單內(nèi)容:
    if request.form['username']=='admin' and request.form['password']=='password':
        return '<h3>Hello, admin!</h3>'
    return '<h3>Bad username or password.</h3>'
if __name__ == '__main__':
    app.run()

格式化顯示json

復制代碼 代碼如下:

print(json.dumps(data, indent=4))
# 或者
import pprint
pprint.pprint(data)

實現(xiàn)類似Java或C中的枚舉

復制代碼 代碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import itertools
import sys
class ImmutableMixin(object):
    _inited = False
    def __init__(self):
        self._inited = True
    def __setattr__(self, key, value):
        if self._inited:
            raise Exception("unsupported action")
        super(ImmutableMixin, self).__setattr__(key, value)
class EnumMixin(object):
    def __iter__(self):
        for k, v in itertools.imap(lambda x: (x, getattr(self, x)), dir(self)):
            if not k.startswith('_'):
                yield v
class _RunnerType(ImmutableMixin, EnumMixin):
    SERIAL = "serial"
    CONSTANT = "constant"
    CONSTANT_FOR_DURATION = "constant_for_duration"
    RPS = "rps"
if __name__=="__main__":
    print _RunnerType.CONSTANT

創(chuàng)建文件時指定權(quán)限

復制代碼 代碼如下:

import os
def write_to_file(path, contents, umask=None):
    """Write the given contents to a file
    :param path: Destination file
    :param contents: Desired contents of the file
    :param umask: Umask to set when creating this file (will be reset)
    """
    if umask:
        saved_umask = os.umask(umask)
    try:
        with open(path, 'w') as f:
            f.write(contents)
    finally:
        if umask:
            os.umask(saved_umask)
if __name__ == '__main__':
    write_to_file('/home/kong/tmp', 'test', 31)
    # Then you will see a file is created with permission 640.
    # Warning: If the file already exists, its permission will not be changed.
    # Note:For file, default all permission is 666, and 777 for directory.

多進程并發(fā)執(zhí)行

復制代碼 代碼如下:

import multiprocessing
import time
import os
def run(flag):
    print "flag: %s, sleep 2s in run" % flag
    time.sleep(2)
    print "%s exist" % flag
    return flag
if __name__ == '__main__':
    pool = multiprocessing.Pool(3)
    iter_result = pool.imap(run, xrange(6))
    print "sleep 5s\n\n"
    time.sleep(5)
    for i in range(6):
        try:
            result = iter_result.next(600)
        except multiprocessing.TimeoutError as e:
            raise
        print result
    pool.close()
    pool.join()

運行時自動填充函數(shù)參數(shù)

復制代碼 代碼如下:

import decorator
def default_from_global(arg_name, env_name):
    def default_from_global(f, *args, **kwargs):
        id_arg_index = f.func_code.co_varnames.index(arg_name)
        args = list(args)
        if args[id_arg_index] is None:
            args[id_arg_index] = get_global(env_name)
            if not args[id_arg_index]:
                print("Missing argument: --%(arg_name)s" % {"arg_name": arg_name})
                return(1)
        return f(*args, **kwargs)
    return decorator.decorator(default_from_global)
# 如下是一個裝飾器,可以用在需要自動填充參數(shù)的函數(shù)上。功能是:
# 如果沒有傳遞函數(shù)的deploy_id參數(shù),那么就從環(huán)境變量中獲?。ㄕ{(diào)用自定義的get_global函數(shù))
with_default_deploy_id = default_from_global('deploy_id', ENV_DEPLOYMENT)   

嵌套裝飾器

validator函數(shù)裝飾func1,func1使用時接收參數(shù)(*arg, **kwargs),而func1又裝飾func2(其實就是Rally中的scenario函數(shù)),給func2增加validators屬性,是一個函數(shù)的列表,函數(shù)的接收參數(shù)config, clients, task。這些函數(shù)最終調(diào)用func1,傳入?yún)?shù)(config, clients, task, *args, **kwargs),所以func1定義時參數(shù)是(config, clients, task, *arg, **kwargs) 
最終實現(xiàn)的效果是,func2有很多裝飾器,每個都會接收自己的參數(shù),做一些校驗工作。

復制代碼 代碼如下:

def validator(fn):
    """Decorator that constructs a scenario validator from given function.
    Decorated function should return ValidationResult on error.
    :param fn: function that performs validation
    :returns: rally scenario validator
    """
    def wrap_given(*args, **kwargs):
        """Dynamic validation decorator for scenario.
        :param args: the arguments of the decorator of the benchmark scenario
        ex. @my_decorator("arg1"), then args = ('arg1',)
        :param kwargs: the keyword arguments of the decorator of the scenario
        ex. @my_decorator(kwarg1="kwarg1"), then kwargs = {"kwarg1": "kwarg1"}
        """
        def wrap_validator(config, clients, task):
            return (fn(config, clients, task, *args, **kwargs) or
                    ValidationResult())
        def wrap_scenario(scenario):
            wrap_validator.permission = getattr(fn, "permission",
                                                consts.EndpointPermission.USER)
            if not hasattr(scenario, "validators"):
                scenario.validators = []
            scenario.validators.append(wrap_validator)
            return scenario
        return wrap_scenario
    return wrap_given

inspect庫的一些常見用法

inspect.getargspec(func) 獲取函數(shù)參數(shù)的名稱和默認值,返回一個四元組(args, varargs, keywords, defaults),其中:
args是參數(shù)名稱的列表;
varargs和keywords是*號和**號的變量名稱;
defaults是參數(shù)默認值的列表;

inspect.getcallargs(func[, *args][, **kwds]) 綁定函數(shù)參數(shù)。返回綁定后函數(shù)的入?yún)⒆值洹?/p>

python中的私有屬性和函數(shù)

Python把以兩個或以上下劃線字符開頭且沒有以兩個或以上下劃線結(jié)尾的變量當作私有變量。私有變量會在代碼生成之前被轉(zhuǎn)換為長格式(變?yōu)楣校?,這個過程叫"Private name mangling",如類A里的__private標識符將被轉(zhuǎn)換為_A__private,但當類名全部以下劃線命名的時候,Python就不再執(zhí)行軋壓。而且,雖然叫私有變量,仍然有可能被訪問或修改(使用_classname__membername),所以, 總結(jié)如下:

無論是單下劃線還是雙下劃線開頭的成員,都是希望外部程序開發(fā)者不要直接使用這些成員變量和這些成員函數(shù),只是雙下劃線從語法上能夠更直接的避免錯誤的使用,但是如果按照_類名__成員名則依然可以訪問到。單下劃線的在動態(tài)調(diào)試時可能會方便一些,只要項目組的人都遵守下劃線開頭的成員不直接使用,那使用單下劃線或許會更好。

相關(guān)文章

  • Python按照list dict key進行排序過程解析

    Python按照list dict key進行排序過程解析

    這篇文章主要介紹了Python按照list dict key進行排序過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Python之Numpy?常用函數(shù)總結(jié)

    Python之Numpy?常用函數(shù)總結(jié)

    這篇文章主要介紹了Python之Numpy?常用函數(shù)總結(jié),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • tkinter如何實現(xiàn)label超鏈接調(diào)用瀏覽器打開網(wǎng)址

    tkinter如何實現(xiàn)label超鏈接調(diào)用瀏覽器打開網(wǎng)址

    這篇文章主要介紹了tkinter如何實現(xiàn)label超鏈接調(diào)用瀏覽器打開網(wǎng)址問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python中的 dir() 函數(shù)示例詳解

    Python中的 dir() 函數(shù)示例詳解

    dir()函數(shù)是Python 中一個非常有用的工具,可以用于查找對象的所有屬性和方法,如獲取當前作用域的變量和方法、查找模塊中的導出內(nèi)容、動態(tài)查找對象屬性等,通過本文的介紹和示例代碼,大家可以更全面地了解 dir() 函數(shù)的用法和注意事項,需要的朋友參考下吧
    2022-03-03
  • python opencv3實現(xiàn)人臉識別(windows)

    python opencv3實現(xiàn)人臉識別(windows)

    這篇文章主要為大家詳細介紹了python opencv3實現(xiàn)人臉識別程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Python爬蟲基于lxml解決數(shù)據(jù)編碼亂碼問題

    Python爬蟲基于lxml解決數(shù)據(jù)編碼亂碼問題

    這篇文章主要介紹了Python爬蟲基于lxml解決數(shù)據(jù)編碼亂碼問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 使用python畫個小豬佩奇的示例代碼

    使用python畫個小豬佩奇的示例代碼

    本文給大家較詳細的介紹了使用python畫個小豬佩奇的示例代碼,感興趣的朋友一起看看吧
    2018-06-06
  • Python?os和os.path模塊詳情

    Python?os和os.path模塊詳情

    這篇文章主要介紹了Python?os和os.path模塊詳情,文章圍繞主題展開詳細的相關(guān)內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-04-04
  • python基于watchdog庫全自動化監(jiān)控目錄文件

    python基于watchdog庫全自動化監(jiān)控目錄文件

    這篇文章主要介紹了python基于watchdog庫全自動化監(jiān)控目錄文件,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python BeautifulSoup庫的高級特性詳解

    Python BeautifulSoup庫的高級特性詳解

    在Python的網(wǎng)絡(luò)爬蟲中,BeautifulSoup庫是一個強大的工具,用于解析HTML和XML文檔并提取其中的數(shù)據(jù),在這篇文章中,我們將深入研究BeautifulSoup的一些高級特性,讓您的爬蟲工作更高效,更強大,需要的朋友可以參考下
    2023-08-08

最新評論

柳林县| 武冈市| 凤冈县| 海口市| 大宁县| 新巴尔虎左旗| 泰兴市| 鲁山县| 黄浦区| 宜丰县| 巫溪县| 嘉义县| 芮城县| 仁布县| 玛沁县| 佛冈县| 渝北区| 津南区| 东丽区| 大竹县| 桐梓县| 塔河县| 高雄县| 庐江县| 海宁市| 江口县| 哈密市| 扎鲁特旗| 资源县| 喀喇沁旗| 望城县| 天津市| 龙陵县| 阿克苏市| 舞钢市| 察隅县| 临安市| 临清市| 会理县| 广河县| 黔东|