【问题标题】:Call a function using getattr in Python [duplicate]在Python中使用getattr调用函数[重复]
【发布时间】:2016-03-26 15:36:09
【问题描述】:

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

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

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

我正在使用 pickle.loads 解压数据,现在我有一个函数名称作为 str 和字典来处理。如果我对其进行硬编码 - 它会起作用。

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

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

【问题讨论】:

  • 添加一些实际代码,因为您完全不清楚您在问什么

标签: python sockets serialization


【解决方案1】:

如果不了解您迄今为止所做的尝试,很难了解您到底想要完成什么。

不过,如果你要调用的函数实际上是某个对象的方法,你可以使用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())

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

def wow():
    return "spam"

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

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

def foo():
    ...

def bar():
    ...

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

funcs["foo"]()

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

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2010-10-03
    • 2019-11-02
    • 2011-09-13
    相关资源
    最近更新 更多