本问题已经有最佳答案,请猛点这里访问。
我想写一个最简单的程序,让我有机会使用套接字和序列化。
其基本思想是使用函数名和要处理的数据将数据传输到服务器端。然后反序列化服务器端发送的数据,调用函数并执行一些操作。然后发送回响应。
现在发送到服务器的数据——我需要调用的func名称,我需要用那个func处理的数据。
我用泡菜。加载来解包数据,现在我有一个func名称作为str和字典来处理。如果我硬编码它-它会工作。
我需要调用的函数名- func。但我希望能够调用任何将从客户端发送的函数。
我知道我需要使用getattr才能做到这一点。但如何?我在这里和其他网站上读了一些问题,但仍然不知道我需要做什么。
如果没有看到到目前为止所做的努力,就很难看到自己到底想要完成什么。
尽管如此,如果你想调用的函数实际上是某个对象上的一个方法,你可以使用getattr:
1 2 3 4 5 6 7 8 | # somestring is a string, but could be any object somestring ="valentyn" # somestring.upper happens to be a method method = getattr(somestring,"upper") # ...which can be called in the usual manner print(method()) |
如果你想调用本地定义的函数,你可以使用local ():
1 2 3 4 5 | def wow(): return"spam" # locals() returns a dict of variables and functions that are locally defined print(locals()["wow"]()) |
如果你事先知道你想要公开哪些函数,你可以考虑把它们录下来:
1 2 3 4 5 6 7 8 9 | def foo(): ... def bar(): ... funcs = {"foo": foo,"bar": bar} funcs["foo"]() |
最后,如果您想要运行的代码实际上是像您所说的那样从客户机发送的,那么您唯一的选择就是使用