偏函式就是固定原函式的某個引數,比如newadd就是固定了add方法的第一個引數,讓a=3,這樣對newadd方法只要傳入引數B就可以實現add方法了,剛看偏函式的寫法可能會不適應,因為partial的第一個引數為一個方法,後面引數卻為該方法的引數。
偏函式不僅可以固定一個引數,而且可以固定多個,按照從左到右的方法固定。
當函式的引數個數太多,需要簡化時,使用functools.partial
可以建立一個新的函式,這個新函式可以固定住原函式的部分引數,從而在呼叫時更簡單。
import functools
def add(a,b):
return a+b
def addMulti(a,b,c):
return a*(b+c)
if __name__ == '__main__':
newadd=functools.partial(add,3)
newadd1=functools.partial(addMulti,0)
newadd2=functools.partial(addMulti,3,0)
print newadd(5)
print newadd1(4,3)
print newadd2(4)
輸出結果依次為8 ,0,12
這樣再看tornado的例子就不難理解了
import errno
import functools
import ioloop
import socket
def connection_ready(sock, fd, events):
while True:
try:
connection, address = sock.accept()
except socket.error, e:
if e.args[0] not in (errno.EWOULDBLOCK, errno.EAGAIN):
raise
return
connection.setblocking(0)
handle_connection(connection, address)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(0)
sock.bind(("", port))
sock.listen(128)
oop 例項
io_loop = ioloop.IOLoop.instance()
ection_ready 的第一個引數為 sock ,既 socket 的返回值
callback = functools.partial(connection_ready, sock)
第一個引數是將 sock 轉換為標準的描述符,第二個為回撥函式,第三個是事件型別
io_loop.add_handler(sock.fileno(), callback, io_loop.READ)
io_loop.start()