1

我有 3 个文件 a.py、b.py、c.py

我正在尝试从 a.py 中动态导入在 c.py 中定义的名为“C”的类,并在 b.py 中提供评估的名称

python a.py 当前正在捕获 NameError。我试图避免这种情况并在 b.py 中创建一个调用 C.do_int(10) 的实例

一个.py

import b

#older
#services = __import__('services')
#interface = eval('services.MyRestInterface')

# python2.7
import importlib
module = importlib.import_module('c')
interface = eval('module.C')

# will work
i = interface()
print i.do_int(10)

# interface isn't defined in b.py after call to eval
try:
  print b.call_eval('interface')
except NameError:
  print "b.call_eval('interface'): interface is not defined in b.py"

b.py

def call_eval(name):
  interface = eval(name)
  i = interface()
  return i.do_int(10)

py

class C(object):
  my_int = 32
  def do_int(self, number):
    self.my_int += number
    return self.my_int

我怎样才能做到这一点?

4

3 回答 3

0

如果 a.py 已经加载了该类,我看不到按名称传递它的原因。相反,做

# b.py
def call_eval(klass):
  j = klass()
  return i.do_int(10)

并且,在 a.py 中,执行

import importlib
module = importlib.import_module('c')
interface = getattr(module, 'C')
b.call_eval(interface)
于 2013-01-30T17:41:00.597 回答
0

我确信完全避免这种情况应该有更好的解决方案。

但这可以解决问题:

一个.py:

shared_variables = {}
import b

import c
shared_variables['C'] = c.C

b.do_something_with('C')

b.py:

from __main__ import shared_variables

def do_something_with(name):
    print(shared_variables[name])
于 2013-01-30T01:49:16.803 回答
0

interface仅存在于a的命名空间中。您可以像这样将接口的引用放入b's 命名空间

b.interface = interface
try:
  print b.call_eval('interface')
except NameError:
  print "b.call_eval('interface'): interface is not defined in b.py"

我不确定你为什么不只是将接口传递call_eval

于 2013-01-30T00:16:38.327 回答