2016-10-23 11 views
0

同じインターフェース(同じ 'duck-type')のさまざまな実装間で 'コンパイル時'の切り替えを実現する自然な仕組みを見つけようとしています。同じ機能を実装し、それぞれNumber1.pyNumber2.pyで定義されたモジュールエイリアシングを使用したさまざまな実装間の切り替え

class Number1(object) 
    ... 

def fromBytes(byteArray): 
    ... 

class Number2(object) 
    ... 

def fromBytes(byteArray): 
    ... 

、:

は、私はいくつかの工場の機能を持つ2つのクラスがあるとします。私は、次のimportの文で始まるクライアントコードを記述したいと思います:

import Number 

Number.pyモジュールは、単に実装の選択(たとえばNumber1Number2間が行われる)ファイルです。私は当初Number.pyとして離れてやって考えていた:

import Number1 as Number 

を私のクライアントコードで。しかし、いくつかのクライアントモジュールにその選択肢を複製するのではなく、自分のプロジェクトで選択した実装をプロジェクトの単一の場所に指定することをお勧めします。

私は次のようにNumber.pyを定義するので考えた:

良い見ていない
from Number import Number 

# choose your implementation here 
import Number1 
Number = Number1 

しかし、この解決策は、私のクライアントモジュールで始まる持っている私を強制します。私は単純なimport Numberを持っていますし、Number.ZERONumber.fromBytes(...)のように私の工場の機能を呼び出してください...これを行うためのpythonic方法は何ですか?

答えて

3

ワイルドカードインポートを使用すると、それに取り組むのが最も簡単な方法です。

Number.py:すべてのクライアントコードで

if use_module_1: 
    from Number1 import * 
else: 
    from Number2 import * 

import Number 
# or 
from Number import some_name 

ワイルドカードインポートは通常、悪い習慣と見なされている間、あなたが実際にがしたいから、それは、ここではケースではありませんNumber名前空間をすべてNumber1またはNumber2のすべての要素で汚染します。

+0

ありがとうございます!できるだけ早く回答を受け入れる –

関連する問題