我需要从字符串转换为名为references的代码。目前唯一的选项是制作脚本的脚本,我认为它可以像exec
一样内联。
class finder:
def __init__(self, parent):
self.parent = parent
def isin(self, what):
return what in self.parent
def find(self, what):
if self.isin(what): return self.parent.__dict__[what.__name__]
else: return __import__("pull").__dict__["downloader"](self.parent.hosts).download(what)
def put(self, what):
f = self.find(what)
self.parent.__dict__[f.__name__] = f
from sock import Socket
from unpack import unpacker
...
class downloader:
def __init__(self, hosts):
self.hosts = hosts
def download(name):
for host in hosts:
pack = unpacker()
s = Socket(host[0], host[1])
s.send("get " + name)
f = pack.unpack(s)
if f is not None: return f
答案 0 :(得分:4)
我可能错了,但我认为您正在寻找的是能够根据在运行时确定的字符串查找方法或属性的符号。如果是这种情况,我会采用与基于exec
或eval
的策略不同的方法来解决问题,例如潜在的python注入攻击和棘手的调试......
在python中一切是一个对象,包括模块,类和方法。这对你来说有什么帮助,一个模块,我们称之为spam
可能有一个方法,我们称之为eggs
你可以通过它的名字访问eggs
方法:
spam.__dict__['eggs']
现在你可能会问“但是如何通过它的名字找到spam
模块?”这可以通过使用__import__
:
spam = __import__('spam')
因此,要调用不带参数的eggs
方法:
s = __import__('spam')
e = s.__dict__['eggs']
e()
答案 1 :(得分:0)
尝试eval
>>> a = 'hi'
>>> b = 'a'
>>> eval(b)
'hi'