3 回答
TA贡献1893条经验 获得超10个赞
不存在这样的结构。函数中的代码没有引用该函数的特殊方法。
在初始启动后,函数的执行实际上并不涉及函数本身。启动后,函数所需的只是代码对象,这是堆栈帧保留引用的唯一部分。您无法仅从代码对象中恢复函数 - 许多函数可以共享相同的代码对象。
TA贡献1772条经验 获得超8个赞
您可以使用装饰器执行此操作,该装饰器将参数列表添加到传递给方法的参数列表中。
相同的方法可以扩展到类装饰器中,该类装饰器对类的部分或全部方法执行此操作。
下面是单方法修饰器的示例实现:
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贡献1831条经验 获得超4个赞
你不能有任何无黑客的方法从该函数中获取函数的名称,但如果你只是希望一个函数返回其参数作为字典,你可以使用这个:
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
使用包括当地人在内的黑客:
class MyClass:
def MyFunc(self, thing1=0, thing2=0, thing3=0, thing4="", thing5=""):
d=locals().copy()
del d["self"]
return d
添加回答
举报