3 回答

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
不存在這樣的結(jié)構(gòu)。函數(shù)中的代碼沒(méi)有引用該函數(shù)的特殊方法。
在初始啟動(dòng)后,函數(shù)的執(zhí)行實(shí)際上并不涉及函數(shù)本身。啟動(dòng)后,函數(shù)所需的只是代碼對(duì)象,這是堆棧幀保留引用的唯一部分。您無(wú)法僅從代碼對(duì)象中恢復(fù)函數(shù) - 許多函數(shù)可以共享相同的代碼對(duì)象。

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以使用裝飾器執(zhí)行此操作,該裝飾器將參數(shù)列表添加到傳遞給方法的參數(shù)列表中。
相同的方法可以擴(kuò)展到類(lèi)裝飾器中,該類(lèi)裝飾器對(duì)類(lèi)的部分或全部方法執(zhí)行此操作。
下面是單方法修飾器的示例實(shí)現(xiàn):
from inspect import signature
def add_paramlist(func):
paramlist = list(signature(func).parameters)
try:
paramlist.remove('paramlist')
except ValueError as exc:
raise RuntimeError(f'"paramlist" argument not declareed in signature of '
f'{func.__name__}() method') from exc
def wrapped(*args, **kwargs):
return func(paramlist, *args, **kwargs)
return wrapped
class MyClass:
@add_paramlist
def MyFunc(paramlist, self, thing1=0, thing2=0, thing3=0, thing4="", thing5=""):
P = {}
for p in paramlist:
P[p] = eval(p)
return P
from pprint import pprint
inst = MyClass()
res = inst.MyFunc(thing1=2, thing2=2, thing3=2, thing4="2", thing5="2")
pprint(res)
輸出:
{'self': <__main__.MyClass object at 0x00566B38>,
'thing1': 2,
'thing2': 2,
'thing3': 2,
'thing4': '2',
'thing5': '2'}

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
你不能有任何無(wú)黑客的方法從該函數(shù)中獲取函數(shù)的名稱(chēng),但如果你只是希望一個(gè)函數(shù)返回其參數(shù)作為字典,你可以使用這個(gè):
class MyClass:
def MyFunc(self,**kwargs):
return kwargs
或者,如果要使用 *args:
class MyClass:
def MyFunc(self,*args,**kwargs):
names=["thing%d"%i for i in range(1,6)]
for v,k in zip(args,names):
if k in kwargs:
raise ValueError
else:
kwargs[k]=v
return kwargs
使用包括當(dāng)?shù)厝嗽趦?nèi)的黑客:
class MyClass:
def MyFunc(self, thing1=0, thing2=0, thing3=0, thing4="", thing5=""):
d=locals().copy()
del d["self"]
return d
添加回答
舉報(bào)