2010-12-03 2 views
0

クライアント・サーバー・アプリケーションを開発していて、3つのファイル(client.pyserver.pycommon.py,)を持ち、common.pyが便利な機能(normalize()など)を持っているなら、クライアントとサーバーの両方から次のようなことが容易です:パッケージがディレクトリでないときに 'import *'を呼び出してインポートされた関数を呼び出す方法

from common import * 

url = normalize(url) 

しかし、いろいろな理由から、別々のサブディレクトリ(clientservercommon)を持っていて、それぞれの関数が独自のファイルを持っていても、同様のショートカットがないようです。

私は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/') 
+0

なぜ機能ごとに1つのファイルを作成するのですか?これは、あなたの関数が大きすぎるか、あるいは何百ものファイルを得ることを意味します。 – AndiDog

+2

私はいろいろ奇妙だから。 –

+0

まあ、あなたが奇妙な場合は、Pythonにパッチを当てることができるので、 'from common import *、*。*':Dのような構文を書くことができます。とにかく、関数ごとに1つのファイルを持つことは、確かにpythonic IMOではありません。 – AndiDog

答えて

5

ディレクトリの輸入内__init__.pyimport *にインポートされますものは、それはありません提供制限された__all__server/__init__.pycommonからcommon/__init__.pyとすべてのclient/__init__.py

+0

ああ、そうだよ!デュ:自己の顔を叩く:それは、レームテスト! –

+0

それでした。とても有難い。 –

0

移動client.pyserver.pyは以前と同じように動作します。

限り命名に関しては、client.pyclient/__init__.pyclientというパッケージの一部であり、clientと呼ばれるモジュールです。 client/something.pyを追加し、import clientimport client.somethingfrom client import somethingなどを追加することができます。

client/__init__.py

from client.foo import * 
from client import bar 

client/foo.py

__all__ = ('baz',) 

def baz(): pass 

client/bar.py

def something(): pass 

これは、その後することができます物事の一般的な方法は、一緒にclient/__init__.pyだけ引っ張っものを持っていることもありますのように使用する次のようになります。

import client 
client.baz() 
client.bar.something() 
from client import bar 
bar is client.bar 
from client import foo 
foo.baz is client.baz 

時々、標準ライブラリを見て、そのような機能がどのように使用されているかを見ると便利です。

+0

私は代わりに、相対的なインポートを使用したいと思います。 –

+0

@Ignacio:可能であれば、正確に。参考までに、 'from .foo import *'と 'from。 import bar'を 'client/__ init __。py'に追加します。 [PEP 328](http://www.python.org/dev/peps/pep-0328/)を参照してください。 –

関連する問題