如何将可调用函数的字符串表示形式作为参数传递给另一个?
@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()
中得到合理的东西,基本上是作为参数传递的字符串表示,尽管它是可调用的?
答案 0 :(得分:0)
我想问题是你描述的函数名实际上是不明确的,因为你总是可以创建更多的引用,比如a = b = c = r1.callback
。在这里选择哪个名称?
相反,如果你想要的是像r1
这样的对象中的那个函数的特定名称,那么它不是一个改变add_callback
的选项,所以它需要父对象和方法的名称直接作为字符串,然后自己解包?
r2.add_callback(parent=r1, name="callback")