Python:获取可调用函数参数的名称

时间:2018-02-20 10:59:32

标签: python-3.x

如何将可调用函数的字符串表示形式作为参数传递给另一个?

 @Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    handler.proceed(); // Ignore SSL certificate errors
}

我想在我的def foo(): print("This is my callback function") def bar(callback=None): print(*something*) bar(foo) 以某种方式访问​​实际名称bar()作为字符串。我考虑过foo,但在我的情况下它没有达到预期效果:

我需要这样做的原因是我试图在现有代码的基础上添加网络层,以便代码可以是本地代码,也可以是部分远程代码。由于底层数据模型用于许多应用程序和位置,我想添加一个“模拟”类层,实现远程执行只需要一个不同的import语句导入我的模拟类,这些类可以远程执行代码的某些部分。

当模型处于开发阶段时,我不想实现原始类的一对一副本,而只需要__name__ hack让模拟类响应可能被调用的任何方法,并通过到那里重建的偏远一侧。

我很惊讶这实际上工作得很好,但现在我遇到了需要在远程端执行的某些回调函数的问题。我只需要知道他们的名字,而不是实际的实例,因为我需要根据通过网络发送的信息在远程端创建回调结构。

考虑这个类(在这个意义上不能正常工作):

__getattr__()

和类class Remote1(RemoteExec): kind = "Remote1" def __init__(self, parent, *args, **kwargs): super().__init__(parent, *args, **kwargs) self.parent.children.append({"kind": Remote1, "link": self}) def __getattr__(self, name): def foo(*args, **kwargs): key = name for _a in args: key += str(_a) _kwa = {} for k, v in kwargs.items(): if callable(v): _remotename = v.__name__ _kwa[k] = _remotename print(k, v, _remotename) continue else: _kwa[k] = v self.functions[key] = {"func": name, "args": args, "kwargs": kwargs} return foo Remote2相同。现在,如果我有

Remote1

我需要在远程端重新创建它。现在问题是获得足够的信息传输。我的print语句返回此内容,没有引用r1 = Remote1() r2 = Remote2() r2.add_callback(callback=r1.callback)

callback()

因为callback <function Remote1.__getattr__.<locals>.foo at 0x7f8148489048> foo 函数不存在但被getattr hack捕获,并且函数名被callback()替换。

我怎样才能在foo()中得到合理的东西,基本上是作为参数传递的字符串表示,尽管它是可调用的?

1 个答案:

答案 0 :(得分:0)

我想问题是你描述的函数名实际上是不明确的,因为你总是可以创建更多的引用,比如a = b = c = r1.callback。在这里选择哪个名称?

相反,如果你想要的是像r1这样的对象中的那个函数的特定名称,那么它不是一个改变add_callback的选项,所以它需要父对象和方法的名称直接作为字符串,然后自己解包?

r2.add_callback(parent=r1, name="callback")