按需功能共享

时间:2011-06-07 20:37:34

标签: python

我需要从字符串转换为名为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

2 个答案:

答案 0 :(得分:4)

我可能错了,但我认为您正在寻找的是能够根据在运行时确定的字符串查找方法或属性的符号。如果是这种情况,我会采用与基于execeval的策略不同的方法来解决问题,例如潜在的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'