在Python中使用getattr调用函数[重复]

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

添加一些实际代码,因为您完全不清楚您在问什么 【参考方案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 - 但是,这将比上述选项更不安全。

【讨论】:

以上是关于在Python中使用getattr调用函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python 类中__getattr__的使用

python 内置函数

python __getattr__

Python-魔法函数__getattr__()与__getattribute__()的区别

python 内置函数getattr

Python的内建函数getattr()如何使用?