我有3个文件a.py,b.py,c.py
我正在尝试从a.py中动态导入c.py中定义的名为“C”的类 并在b.py
中提供评估名称python a.py目前正在捕获NameError。我试图避免这种情况并创建一个 b.py中的实例调用C.do_int(10)
a.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)
c.py
class C(object):
my_int = 32
def do_int(self, number):
self.my_int += number
return self.my_int
我怎样才能做到这一点?
答案 0 :(得分:0)
interface
仅存在于a
的命名空间中。您可以将接口的引用添加到b
的命名空间中,如此
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
但
答案 1 :(得分:0)
我确信应该有一个更好的解决方案,完全避免这种情况。
但这可以解决问题:
a.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])
答案 2 :(得分: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)