Python 拷貝函式簽名

2021-09-08 17:09:31 字數 1521 閱讀 3481

使用場景有很多,比如c api在python下很多都變成了(*args, **kwargs)的引數,這時候可能需要為其新增乙個更嚴格簽名來約束引數。

查了許多資料,能有效的拷貝函式簽名貌似只能通過動態建立具有新簽名的包裝函式。使用這一技術的典型範例就是decorator庫:

下面就根據decorator來實現乙個拷貝函式簽名的decorator:

from decorator import functionmaker, decorator

from contextlib import contextmanager

@contextmanager

def rename_scope(obj, new_name):

""" a rename scope to rename obj's __name__, restore __name__when exit. """

old_name = obj.__name__

obj.__name__ = new_name

yield

obj.__name__ = old_name

def newcaller(caller, sig_func):

""" generate a new caller using sig_func signatures, doc and name, etc. """

evaldict = sig_func.func_globals.copy()

evaldict['_call_'] = caller

return functionmaker.create(

sig_func, "return _call_(%(shortsignature)s)",

evaldict, signature=sig_func)

def signature(sig_func, copy_name=false):

""" a decorator to update function signature, doc by sig_func. if copy_name, the return function use sig_func name else function keep its name. """

with rename_scope(sig_func, sig_func.__name__ if copy_name else caller.__name__):

return newcaller(caller, sig_func)

用起來大概是這乙個樣子:

目前實現的signature能夠控制是否拷貝簽名函式的函式名,對於doc也可以實現類似的可控制的引數。

python的sign簽名函式

a公司給b公司開發了乙個介面,那麼a公司給b公司乙個sign簽名,確保資料的安全。客戶端 當使用者請求服務前,會定義請求引數,通過這些引數,生成相應的sign簽名,生成之後,傳給伺服器。服務端 接收傳過來的請求資料,先根據傳過來的引數,生成sign簽名,之後與客戶端傳來的sign簽名進行乙個比對,如...

Python之深淺拷貝 函式

一 深淺拷貝 深淺拷貝是指copy模組下的copy 和deepcopy 方法。1 淺拷貝 示例 import copy a hello word b a1 copy.copy a b1 copy.copy b print id a 140458175739296 print id a1 140458...

拷貝建構函式,預設拷貝建構函式

拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...