我不久前发布了此信息。我一直在取得一些进步,这似乎比我想象的要棘手。Python:获取可呼叫函数参数的名称
我已经取得了@wraps
的进步,现在我可以进一步进一步。这是一个值得自己线程的单独问题。
不久,我如何访问类实例,函数调用是谁的成员?这是一个完整的工作代码段,说明了该问题(仅Python 3(。
如果有人在乎,我需要在其他帖子中解释了我需要这样做的原因。当我调用b.set_something()
时,参数是a的方法调用。但是,由于A中没有方法" set_something_else",但它被__getattr__()
hack抓住了,我正在努力识别我正在使用的工作,因为我需要在远程服务器上"解释"远程服务器,类实例执行了哪些功能,并具有可能可呼叫的参数到其他类。
因此,我想在每个类实例中添加ID并将其用作参考。当我的b
对象以a.get_something_else
作为参数接收到b.get_something()
的呼叫时,我现在可以是因为@wraps在我的B中检测到
- 该功能是A类
- 功能名称为" get_something_else"
现在,唯一缺少的链接是从A的实例中获取" ID",其成员get_something_else
恰好是。这将使我能够将所有内容链接在一起。但是如何从B中引用它?我唯一的信息是可呼叫参数a.get_something_else。我能够自由修改foo和bar,但不能自由修改变量A和B的最后一部分。
from functools import wraps
import uuid
class Bar:
def __init__(self):
self.id = str(uuid.uuid4())
def __getattr__(self, name):
@wraps(name)
def foo(*args, **kwargs):
_kwa = {}
for k, v in kwargs.items():
if callable(v):
cn = "{}.{}".format(v.__qualname__.split(".")[0], v.__wrapped__)
# How to get "id" from the object whose member v is??
_kwa[k] = cn
continue
else:
_kwa[k] = v
x = {"args": args, "kwargs": _kwa}
print(x)
return foo
class Foo:
def __init__(self):
self.id = str(uuid.uuid4())
def __getattr__(self, name):
@wraps(name)
def foo(*args, **kwargs):
_kwa = {}
for k, v in kwargs.items():
if callable(v):
cn = "{}.{}".format(v.__qualname__.split(".")[0], v.__wrapped__)
_kwa[k] = cn
continue
else:
_kwa[k] = v
x = {"args": args, "kwargs": _kwa}
print(x)
return foo
a = Foo()
b = Bar()
b.set_something(command=a.set_something_else)
不确定这是否正是您想要的,但是您是否检查了超级功能?class parent((: def init (self(: super(parent,self(。 init ((