1

私は3つのファイルa.py、b.py、c.pyを持っています

a.py内からc.pyで定義された「C」というクラスを動的にインポートし、評価された名前をb.pyで使用できるようにしようとしています

python a.py は現在 NameError をキャッチしています。これを回避し、C.do_int(10) を呼び出すインスタンスを b.py に作成しようとしています。

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

どうすればこれを達成できますか?

4

3 に答える 3

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])
于 2013-01-30T01:49:16.803 に答える
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

interfaceaの名前空間にのみ存在します。このように、インターフェースへ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

于 2013-01-30T00:16:38.327 に答える