sockets:在Python中使用getattr调用函数

本问题已经有最佳答案,请猛点这里访问。

我想写一个最简单的程序,让我有机会使用套接字和序列化。

其基本思想是使用函数名和要处理的数据将数据传输到服务器端。然后反序列化服务器端发送的数据,调用函数并执行一些操作。然后发送回响应。

现在发送到服务器的数据——我需要调用的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"]()

最后,如果您想要运行的代码实际上是像您所说的那样从客户机发送的,那么您唯一的选择就是使用eval——然而,这甚至比上面的选项更不安全。