さて、これは少し複雑です。
パッケージ内にモジュールがあるとしましょう:
a_package
|-- __init__.py
|-- a_module.py
内部a_module.py
で私は宣言しA_Class
ます:
# file location: a_package/a_module.py
class A_Class():
def say(self):
print ("cheese")
これを行うことで、インスタンスを作成してメソッドA_Class
を呼び出すことができます。say
from a_package.a_module import A_Class
my_object = A_Class()
my_object.say() # this will display 'cheese' as expected
ただし、より動的なアプローチを行いたい (パッケージとクラスをたくさん用意する予定で、コードをより簡単に記述できるようにしたい)。だから、私はと呼ばれる関数を作りますload_class
def load_class(package_name, module_name, class_name)
result = None
try:
exec('from ' + package_name + '.' + module_name + ' import ' + class_name)
exec('result = '+class_name)
except:
raise ImportError('Unable to load the class')
return result
# Now, I can conveniently do this:
A_Class = load_class('a_package', 'a_module', 'A_Class')
my_object = A_Class()
my_object.say()
# or even shorter:
load_class('a_package', 'a_module', 'A_Class')().say()
プログラムは期待どおりに動作しますが、IDE (私は pydev を使用) は私のコードを理解せず、インテリセンス (コードを自動的に完成させます) を実行できません。
最初のアプローチを使用すると、インテリセンスは明らかに機能します。
from a_package.a_module import A_Class
my_object = A_Class()
my_object. # when I press ".", there will be a popup to let me choose "say" method
しかし、2 番目のアプローチを使用すると、インテリセンスは補完を行うことができません。
load_class('a_package', 'a_module', 'A_Class')(). # when I press ".", nothing happened
私は知っています、これはPythonでの動的インポートのトレードオフです。exec
しかし、ジェネリックIDE(Pydevなど)のインテリセンスにクラス内のメソッドを推測させることができる2番目のアプローチ(を使用していない可能性があります)を実行できる代替手段があるかどうかを知りたいですか?
編集:なぜこれを行う必要があるのですか? 私がそのようなディレクトリ構造を持っているとしましょう
fruit
|-- strawberry.py
|-- orange.py
chocolate
|-- cadbury.py
|-- kitkat.py
need_dynamic.py
にneed_dynamic.py
は、次のスクリプトがあります。
food_list = ['fruit', 'chocolate']
subfood_list = [['strawberry', 'orange'],['cadbury', 'kitkat']]
# show food list and ask user to choose food
for i in xrange(len(food_list)):
print i + " : " + food_list[i]
food_index = int(raw_input('chose one'))
# show subfood list and ask user to choose subfood
for i in xrange(len(subfood_list[food_index])):
print i + " : " + subfood_list[food_index][i]
subfood_index = int(raw_input('chose one'))
# init the class
my_class = load_class(food_list[food_index], subfood_list[food_index, subfood_index])
# the rest of the code
これは単純化のためです。実際には、ディレクトリを取得して自動的food_list
に埋める予定です。subfood_list
データ分類フレームワークがあり、ユーザーが使用したい方法を選択できるようにしたいとします。ユーザーは、python パッケージをモジュールに追加するだけで、フレームワークを拡張することもできます。
この例が妥当であることを願っています。
受け入れられた回答をもう一度編集しても、インテリセンスの問題は解決しません。しかし、より良いコーディング方法を示しています。Pythonの問題ではなく、IDEの問題だと思います。別の質問を投稿します。