在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调用函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章