在 Python 中使用 getattr 调用函数

FLA*_*ASh 4 python sockets serialization

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

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

现在发送到服务器的数据 - 我需要调用的 func 名称,我需要使用该 func 处理的数据。

我使用 pickle.loads 来解包数据,现在我有一个 func 名称作为 str 和字典来处理。如果我将它硬编码 - 它会起作用。

我需要调用的 func 名称 - func。但我希望能够调用将从客户端发送的任何函数。

我知道我需要使用 getattr 才能做到这一点。但是如何?我在这里和其他网站上阅读了几个问题,但仍然不知道我需要做什么。

Wan*_*uta 5

如果不了解您目前已尝试过的内容,就很难看出您究竟想要完成什么。

尽管如此,如果您要调用的函数实际上是某个对象上的方法,则可以使用 getattr:

# 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())
Run Code Online (Sandbox Code Playgroud)

如果要调用本地定义的函数,可以使用 locals():

def wow():
    return "spam"

# locals() returns a dict of variables and functions that are locally defined
print(locals()["wow"]())
Run Code Online (Sandbox Code Playgroud)

如果您事先知道要公开哪些函数,则可以考虑制作函数字典:

def foo():
    ...

def bar():
    ...

funcs = {"foo": foo, "bar": bar}

funcs["foo"]()
Run Code Online (Sandbox Code Playgroud)

最后,如果您要运行的代码实际上是从客户端发送的,就像您说的那样,您唯一的选择是使用eval- 但是,这比上面的选项更不安全。