廖雪峰Python教程實戰篇-Day5
- async def handle_url_xxx(request):
- ...
- url_param = request.match_info['key']
- query_params = parse_qs(request.query_string)
- text = render('template', data)
- return web.Response(text.encode('utf-8'))
- # 建立檢視函式裝飾器,用來儲存、附帶URL資訊
- def Handler_decorator(path, *, method):
- def decorator(func):
- @functools.wraps(func)
- def warpper(*args, **kw):
- return func(*args, **kw)
- warpper.__route__ = path
- warpper.__method__ = method
- return warpper
- return decorator
- # 偏函式。GET POST 方法的路由裝飾器
- get = functools.partial(Handler_decorator, method = 'GET')
- post = functools.partial(Handler_decorator, method = 'POST')
- @get
- def View(request):
- return response
- # 使用inspect模組,檢查檢視函式的引數
- # inspect.Parameter.kind 型別:
- # POSITIONAL_ONLY 位置引數
- # KEYWORD_ONLY 命名關鍵詞引數
- # VAR_POSITIONAL 可選引數 *args
- # VAR_KEYWORD 關鍵詞引數 **kw
- # POSITIONAL_OR_KEYWORD 位置或必選引數
- def get_required_kw_args(fn): # 獲取無預設值的命名關鍵詞引數
- args = []
- '''''
- def foo(a, b = 10, *c, d,**kw): pass
- sig = inspect.signature(foo) ==> <Signature (a, b=10, *c, d, **kw)>
- sig.parameters ==> mappingproxy(OrderedDict([('a', <Parameter "a">), ...]))
- sig.parameters.items() ==> odict_items([('a', <Parameter "a">), ...)])
- sig.parameters.values() ==> odict_values([<Parameter "a">, ...])
- sig.parameters.keys() ==> odict_keys(['a', 'b', 'c', 'd', 'kw'])
- '''
- params = inspect.signature(fn).parameters
- for name, param in params.items():
- # 如果檢視函式存在命名關鍵字引數,且預設值為空,獲取它的key(引數名)
- if param.kind == inspect.Parameter.KEYWORD_ONLY and param.default == inspect.Parameter.empty:
- args.append(name)
- return tuple(args)
- def get_named_kw_args(fn): # 獲取命名關鍵詞引數
- args = []
- params = inspect.signature(fn).parameters
- for name, param in params.items():
- if param.kind == inspect.Parameter.KEYWORD_ONLY:
- args.append(name)
- return tuple(args)
- def has_named_kw_arg(fn): # 判斷是否有命名關鍵詞引數
- params = inspect.signature(fn).parameters
- for name, param in params.items():
- if param.kind == inspect.Parameter.KEYWORD_ONLY:
- returnTrue
- def has_var_kw_arg(fn): # 判斷是否有關鍵詞引數
- params = inspect.signature(fn).parameters
- for name, param in params.items():
- if param.kind == inspect.Parameter.VAR_KEYWORD:
- returnTrue
- def has_request_arg(fn): # 判斷是否含有名叫'request'的引數,且位置在最後
- params = inspect.signature(fn).parameters
- found = False
- for name, param in params.items():
- if name == 'request':
- found = True
- continue
- if found and (
- param.kind != inspect.Parameter.VAR_POSITIONAL and
- param.kind != inspect.Parameter.KEYWORD_ONLY and
- param.kind != inspect.Parameter.VAR_KEYWORD):
- # 若判斷為True,表明param只能是位置引數。且該引數位於request之後,故不滿足條件,報錯。
- raise ValueError('request parameter must be the last named parameter in function:%s%s' % (fn.__name__, str(sig)))
- return found
- # 定義RequestHandler從檢視函式中分析其需要接受的引數,從web.Request中獲取必要的引數
- # 呼叫檢視函式,然後把結果轉換為web.Response物件,符合aiohttp框架要求
- class RequestHandler(object):
- def __init__(self, app, fn):
- self._app = app
- self._func = fn
- self._required_kw_args = get_required_kw_args(fn)
- self._named_kw_args = get_named_kw_args(fn)
- self._has_request_arg = has_request_arg(fn)
- self._has_named_kw_arg = has_named_kw_arg(fn)
- self._has_var_kw_arg = has_var_kw_arg(fn)
- # 1.定義kw,用於儲存引數
- # 2.判斷檢視函式是否存在關鍵詞引數,如果存在根據POST或者GET方法將request請求內容儲存到kw
- # 3.如果kw為空(說明request無請求內容),則將match_info列表裡的資源對映給kw;若不為空,把命名關鍵詞引數內容給kw
- # 4.完善_has_request_arg和_required_kw_args屬性
- async def __call__(self, request):
- kw = None
相關推薦
廖雪峰Python教程實戰篇-Day5
async def handle_url_xxx(request): ... 第二步,傳入檢視函式的引數要自己從request中獲取:url_param = request.match_info['key'] query_params = parse_qs(request.query
這篇部落格記錄廖雪峰python教程的習題(二)
函數語言程式設計 高階函式—–sorted 首先我們需要明確一點就是sorted()函式是作用於一個列表,對列表中的每一項元素進行排序,因為sorted本身的作用就是對元素排序,如果後面還有key=function ,則是先對列表中的每一項元素按照fun
Python 學習從廖雪峰 Python教程開始
https info python 學習 分享 圖片 png wiki src ima https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 Python 學習
廖雪峰--python教程:筆記三
[1] 小寫 對象 gin collect 內置函數 返回值 python 字典 通過 高級特性:前面我們簡單的聊了一下Python的數據類型、語句和函數,接下來來聊聊Python的高級特性 切片:取一個list、tuple、str一部分內容是很常見的操作,而切片操作,可以
關於廖雪峰python教程中__geattr__()函式的一些理解
原文: 利用完全動態的__getattr__,我們可以寫出一個鏈式呼叫: `class Chain(object): def __init__(self, path=''): self._path = path def __getattr__(self, path):
Python 3 學習(一)—— 基礎:廖雪峰 Python 教程學習筆記
文章目錄 Python教程 值型別和引用型別 列表和字典的基本操作 列表 元組 字典 Set 函式 內建函式 定義函式 空函式 引數檢查 定
廖雪峰Python教程答案
課程地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 感謝廖老師。 高階特性 生成器 generator 楊輝三角 楊輝三角定義如下:
廖雪峰Python教程筆記(一)
感謝廖老師精彩的Python教程,收益良多,感謝感謝! 整理筆記,以備後續複習,第一部分一直到模組結束,整理如下,其中大量的單引號是有問題的,由於word直接打的,嫌麻煩,沒有都進行修正,請見諒 1、a = ‘XYZ’ 的過程是先在記憶體中建立一個’XYZ’字串,然後
【Python3.6】:廖雪峰python教程轉換成 PDF
開始寫爬蟲前,我們先來分析一下該網站https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 的頁面結構,網頁的左側是教程的目錄大綱,每個 URL 對應到右邊的一篇文章,右側上
【廖雪峰 python教程 課後題 切片】利用切片操作,實現一個trim()函式,去除字串首尾的空格,注意不要呼叫str的strip()方法:
#encoding:utf-8 #定義一個函式,用來去除字串首尾的空格 def trim(s): '''首先判斷該字串是否為空,如果為空,就返回該字串, 如果不為空的話,就判斷字串首尾字元是否為空, 如果為空,就使用遞迴再次呼叫該函式trim(),否
廖雪峰python教程之用map函式實現大小寫轉換
題目:利用map()函式,把使用者輸入的不規範的英文名字,變為首字母大寫,其他小寫的規範名字。輸入:['adam', 'LISA', 'barT'],輸出:['Adam', 'Lisa', 'Bart'] def normalize(name): return n
廖雪峰python教程day3-編寫ORM
首先要明確: ORM的編寫較為複雜,但編寫完成後使用介面進行呼叫則顯得非常簡單。並且ORM編寫模式基本為 -Field模組 -元類MetaClass -基類Model 有著較為固定的寫法,沒必要重複造輪子,能複用儘量複用。重要的是要理解元類這塊硬骨頭的妙用。 基
【廖雪峰 python教程 課後題改編】利用map()函式,把使用者輸入的不規範的英文名字,變為首字母大寫,其他小寫的規範名字
原題目: # -*- coding: utf-8 -*- #輸入名字,變成首字母大寫,其他字母小寫的標準格式 def normalize(name): str1 = '' for i, ch in enumerate(name): if i
廖雪峰python實戰專案_Day1
#! app.py import logging;logging.basicConfig(level=logging.INFO) import asyncio, os, json, time from datetime import datetime from aioh
廖雪峰Python 2.X 教程
Python簡介Python是著名的“龜叔”Guido van Rossum在1989年聖誕節期間,為了打發無聊的聖誕節而編寫的一個程式語言。當你用一種語言開始作真正的軟體開發時,你除了編寫程式碼外,還需要很多基本的已經寫好的現成的東西,來幫助你加快開發進度。比如說,要編寫一
廖雪峰Python學習筆記——使用元類
ram form 創建對象 字典 comm params int name 學習筆記 元類(MetaClasses) 元類提供了一個改變Python類行為的有效方式。 元類的定義是“一個類的類”。任何實例是它自己的類都是元類。 class demo(object):
廖雪峰python摘錄4
生成 結果 api cnblogs fun 相關 cap object log 1、直接作用於for循環的對象統稱為可叠代對象:Iterable。 可以被next()函數調用並不斷返回下一個值的對象稱為叠代器:Iterator。 2、生成器都是Iterator對象,但
廖雪峰python摘錄5
新的 aps ret col 出錯 簽名 一個 復制 div 1、假設我們要增強now()函數的功能,比如,在函數調用前後自動打印日誌,但又不希望修改now()函數的定義,這種在代碼運行期間動態增加功能的方式,稱之為“裝飾器”(Decorator)。 2、由於log()是一
廖雪峰python摘錄6
rar art ocs 沒有 概念 註意 表示 tar 完全 1 def now(): 2 print(‘hello‘) 3 4 import functools 5 6 def log(func): 7 @functools.wraps
廖雪峰python摘錄二輪2
預編譯 父類 空字符串 返回 提交 update fetch 出了 運行時 1 >>> def set_age(self, age): # 定義一個函數作為實例方法 2 ... self.age = age 3 ... 4 >>>