クライアント・サーバー・アプリケーションを開発していて、3つのファイル(client.py
、server.py
、common.py,
)を持ち、common.py
が便利な機能(normalize()
など)を持っているなら、クライアントとサーバーの両方から次のようなことが容易です:パッケージがディレクトリでないときに 'import *'を呼び出してインポートされた関数を呼び出す方法
from common import *
url = normalize(url)
しかし、いろいろな理由から、別々のサブディレクトリ(client
、server
、common
)を持っていて、それぞれの関数が独自のファイルを持っていても、同様のショートカットがないようです。
私はsys.path
でバイディングしなければなりません。そして、インポート後にurl=normalize.normalize(url)
を使う必要があります。私は回避策をプログラムすることができると確信していますが、私が気付いていないこれを処理するPythonicの方法はすでにありますか?
アップデート:ここでは、Ignacioのアドバイスに従った後のやり方を説明します:
$ cat common/__init__.py; client/login.py jcomeauictx.myopenid.com
import os, sys
for module in os.listdir(os.path.dirname(__file__)):
print >>sys.stderr, 'module: %s' % module
name, extension = os.path.splitext(module)
if extension == '.py' and not name.startswith('_'):
importer = 'from %s import %s' % (name, name)
print >>sys.stderr, 'import statement: %s' % importer
exec(importer)
結果:
module: __init__.py
module: normalize.py
import statement: from normalize import normalize
module: __init__.pyc
module: normalize.pyc
('http://www.myopenid.com/server', 'http://jcomeauictx.myopenid.com/')
なぜ機能ごとに1つのファイルを作成するのですか?これは、あなたの関数が大きすぎるか、あるいは何百ものファイルを得ることを意味します。 – AndiDog
私はいろいろ奇妙だから。 –
まあ、あなたが奇妙な場合は、Pythonにパッチを当てることができるので、 'from common import *、*。*':Dのような構文を書くことができます。とにかく、関数ごとに1つのファイルを持つことは、確かにpythonic IMOではありません。 – AndiDog