廖大python實戰專案第五天

2021-08-14 22:23:53 字數 3348 閱讀 9743

ps: 決定還是堅持寫部落格記錄一下比較好。

今天的實戰內容是編寫web框架,如果之前的知識不熟悉的話確實看不大懂。在這裡奉上自己的理解以及幫助理解的相關資料和文件。

首先我們要知道web框架是什麼東西,它到底要怎麼實現。這一點廖大在web開發的wsgi介面、使用web框架這兩篇文章裡已經說過了。摘要一些略作說明:

def

(environ, start_response):

start_response('200 ok', [('content-type', 'text/html')])

return [b'']

涉及到模組渲染裝飾器我一開始有些不清楚,補一下對應的章節就明白了。

這個方法在前兩天的實戰中已經見過,但還是補一下資料內容。文章:python的hasattr(), getattr(), setattr()函式使用方法詳解。

getattr()是用於獲取物件的屬性或方法,如果存在就列印出來,如果不存在就列印出預設值。需要注意的是,如果是返回的物件的方法,返回的是方法的記憶體位址,如果需要執行這個方法,可以在後面新增一對括號。

參考:

python文件–inspect模組介紹

中文版inspect模組介紹

在這段例項中:

method = getattr

(fn, '__method__', none)

path = getattr

(fn, '__route__', none)

ifpath

isnone

ormethod

isnone:

raise valueerror('@get or @post not defined in %s.' % str(fn))

ifnot asyncio.iscoroutinefunction(fn) and

not inspect.isgeneratorfunction(fn):

fn = asyncio.coroutine(fn)

logging.info('add route %s %s => %s(%s)' % (method, path, fn.__name__, ', '.join

(inspect.signature(fn).parameters.keys

())))

廖大用到了之前沒見過的inspect模組。其中inspect.isgeneratorfunction()好理解,從字面上可以知道是判斷是否為generaor函式。具體的實現暫時不去管它。

後面那個inspect.signature(fn).parameters.keys()有點費解。其中inspect.signature()的功能根據官方文件講是return a signature object for the given callable,即返回傳入的可呼叫函式的所有引數;而之後的paramters似乎是用於索引引數。這是官方的兩個示例:

關於signature

>>> 

from inspect import signature

>>>

deffoo

(a, *, b:int, **kwargs):

...

pass

>>> sig = signature(foo)

>>> str(sig)

'(a, *, b:int, **kwargs)'

>>> str(sig.parameters['b'])

'b:int'

>>> sig.parameters['b'].annotation

關於parameter

>>> def foo(a, b, *, c, d=10):

... pass

>>> sig = signature(foo)

>>> for param in sig.parameters.values():

...if (param.kind == param.keyword_only and

... param.default is param.empty):

# keyword_only: 關鍵字引數

... print('parameter:', param)

parameter: c

所以,廖大的那段**的意思是將函式的所有引數(不包括預設值)用逗號隔開,加入到那個括號裡去。

從右向左查詢,返回字串首次出現的位置;如果沒有匹配項則返回-1。

find()與之類似,只不過是從左向右查詢。

參考:

python官方文件

__import__中文介紹

__import__內建函式是用於動態載入模組的。這個不難理解,關鍵是理解廖大的示例:

def

add_routes

n = module_name.rfind('.') # 找到模組名的最後乙個'.'位置

if n == (-1): # 如果模組名為「xx」這種形式

mod = __import__(module_name, globals(), locals())

else: # 如果模組名為"xx.xx"這種形式

name = module_name[n+1:] # 後半部分即子函式

mod = getattr(__import__(module_name[:n], globals(), locals(), [name]), name) # 載入模組,獲取模組的子函式並返回

for attr in dir(mod): # 對於子函式裡的所有屬性和方法

if attr.startswith('_'): # 如果attr為」__xx"這種形式就忽略

continue

fn = getattr(mod, attr)

if callable(fn): # 如果可呼叫

method = getattr(fn, '__method__', none)

path = getattr(fn, '__route__', none)

if method and path:

***

***

Python學習第五天

1 關於print,使用print方法列印多個表示式也是可行的 print age 12 age 12 2 別名,如果需要引用的方法名出現重複時可以使用別名 from math import sqrt as foobar 3 多個賦值操作可以同時進行 x,y,z 1,2,3 print x,y,z ...

第五天學習python

這其實也不是一天學習的,而是週末和周一一起的。週末學習了如何建立自己的module,記憶如何使用dir 函式。周一初步學習第九章。資料結構。python中主要有三種內建資料結構 列表,元組,字典。list是處理一組有序專案的資料結構,在每個專案中用逗號隔開。列表中的專案包括在方括號中,乙個列表建立之...

Python 基礎 第五天

python是高度物件導向的 獲取使用者的輸入內容可以用input 函式實現 也可以使用str string,字串 類的各種方法。可以用rjust方法來獲得乙個右對齊的指定寬度的字串。檔案 可以使用內建的open函式並指定檔名以及自己所希望使用的開啟模式開啟乙個檔案。開啟模式可以是閱讀模式 r 寫入...