4

tl; dr:いくつかの名前空間に新しい名前空間を作成__init__.pyし、新しいディレクトリにサブモジュールを必要とせずに、別の名前空間の選択ビットをその名前空間にコピーするにはどうすればよいですか?

完全な質問:

パッケージにモジュールのペアがあり、ディレクトリ構造が次のようになっているとします。

foo/mod_1.py
foo/mod_2.py
foo/__init__.py

mod_1.py以下のとおりであります:

import numpy

__all__ = ['test1']

def test1():
    return numpy.zeros(10)

mod_2.py以下のとおりであります:

import numpy

def test2():
    return numpy.zeros(20)

そして__init__.py次のように:

from mod_1 import *
import mod_2

del mod_1

これにより、多かれ少なかれ目的の名前空間が生成されます。

In [7]: dir(foo)
Out[7]: 
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 '__path__',
 'mod_2',
 'test1']

numpyそれがfoo.mod_2名前空間にあることを除いて。で削除しようとすると__init__.pydel mod_2.numpyそのモジュールには存在しなくなったため、mod_2.test2壊れています。

mod_2を含む追加のディレクトリを作成することで目的を達成mod_2.pyできますが、可能であればディレクトリ構造をそのままにしておきたいと思います。

したがって、私の最初の質問。

編集:ある名前が別の名前を踏むのを防ぐために、名前を少し操作してもかまいません。mod_2.pyの関連するビットをに入れてみましょうfoo._mod_2

4

1 に答える 1

3

コードを壊していることに気付いたので、それをしたくありません。

Python は動的言語であり、イントロスペクションにより、インタープリターがアクセスできるほとんどすべてのものに自由にアクセスできます。これはあなたのモジュールにも当てはまります。

気分が良くなる場合は、同じことが標準ライブラリにも当てはまります。

>>> import unittest
>>> unittest.sys
<module 'sys' (built-in)>
>>> unittest.types
<module 'types' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/types.pyc'>
>>> dir(unittest)
['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult', 'TestSuite', 'TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator', '__all__', '__author__', '__builtins__', '__doc__', '__email__', '__file__', '__metaclass__', '__name__', '__package__', '__unittest', '__version__', '_makeLoader', '_strclass', 'defaultTestLoader', 'findTestCases', 'getTestCaseNames', 'main', 'makeSuite', 'os', 'sys', 'time', 'traceback', 'types']

グローバル名前空間でモジュールが必要とするものはすべて、外部から見ることができます。これは正常です。

すでに発見したように、ワイルドカードのインポート__all__を制御するために使用しfrom modulename import *、それ以外の場合はモジュールの名前空間をそのままにしておきます。

もちろん、パッケージのユーザーにクリーンな API を提供したい場合は、API の一部である名前を最上位のパッケージにインポートしたり、モジュール__init__.pyを使用したりすることを妨げるものは何もありません。api.py

インポートとは、現在のモジュールの変数と同じ名前を追加することを意味します。、または実行後の現在のモジュールmod_2.numpyとまったく同じです。sys.modules['numpy']numpyimport numpy

于 2012-11-29T13:46:12.143 に答える