【发布时间】:2011-12-17 16:55:25
【问题描述】:
我有一个 str 对象,例如:menu = 'install'。我想从此字符串运行安装方法。例如,当我调用menu(some, arguments) 时,它会调用install(some, arguments)。有什么办法吗?
【问题讨论】:
标签: python
我有一个 str 对象,例如:menu = 'install'。我想从此字符串运行安装方法。例如,当我调用menu(some, arguments) 时,它会调用install(some, arguments)。有什么办法吗?
【问题讨论】:
标签: python
如果它在一个类中,你可以使用getattr:
class MyClass(object):
def install(self):
print "In install"
method_name = 'install' # set by the command line options
my_cls = MyClass()
method = None
try:
method = getattr(my_cls, method_name)
except AttributeError:
raise NotImplementedError("Class `{}` does not implement `{}`".format(my_cls.__class__.__name__, method_name))
method()
或者如果它是一个函数:
def install():
print "In install"
method_name = 'install' # set by the command line options
possibles = globals().copy()
possibles.update(locals())
method = possibles.get(method_name)
if not method:
raise NotImplementedError("Method %s not implemented" % method_name)
method()
【讨论】:
你也可以使用字典。
def install():
print "In install"
methods = {'install': install}
method_name = 'install' # set by the command line options
if method_name in methods:
methods[method_name]() # + argument list of course
else:
raise Exception("Method %s not implemented" % method_name)
【讨论】:
{'install': install}
methods = {'install': self.install}(或obj.install)
为什么我们不能只使用 eval()?
def install():
print "In install"
新方法
def installWithOptions(var1, var2):
print "In install with options " + var1 + " " + var2
然后你调用如下方法
method_name1 = 'install()'
method_name2 = 'installWithOptions("a","b")'
eval(method_name1)
eval(method_name2)
这将输出为
In install
In install with options a b
【讨论】:
json。
eval(method_name1)(a,b) 也可以。关于安全的公平点——对于小型私人脚本来说还可以,但它们会保持这种状态吗?例如,如果字符串来自网站,请务必小心。 eval 不是这里唯一的问题——在任意来源的字符串上使用 getattr 同样危险。