2016-08-02 3 views
1

Pythonモジュールimport意味的に依存するモジュールですか?Pythonモジュールは、意味的に依存するモジュールをインポートする必要がありますか?

モジュールa

class A(object): 
    ... 
    def foo(self): 
     ... 

モジュールb:たとえば

import a 

def f(a_instance): 
    a_instance.foo() 
    ... 

モジュールbの最初の行は、厳密に言えば、不要であるが、それは良いと考えられていた場合、私は疑問に思いますフォームはPythonで?

+9

モジュールaを直接使用していない場合は、モジュールaをインポートしないでください。あなたのコードでは、あるクラスのインスタンスが必要です。自分の方法が何をしているかに基づいてモジュールaを直接参照することはできません。したがって、「輸入」は無意味です。 – idjaw

+0

これが便利なのは、タイプヒントを行う場合だけです: 'def f(a_instance:a.A)' – acushner

答えて

5

b意味的にははありません。です。

def fが依存する唯一のことは、a_instanceが呼び出し可能な属性.fooを生成するということです。完全停止。

A()またはAChild()、さらにはMagicMockを渡すかどうかは関係ありません。

これは、「ダックタイピング」という語句の意味です。考えてみましょう:

def is_a_duck(duck_candidate): 
    duck_candidate.looks_like_a_duck() 
    duck_candidate.walks_like_a_duck() 
    duck_candidate.quacks_like_a_duck() 
    print('This is a duck') 
    return True 

あなたが.looks_like_a_duck()何か、と.walks_like_a_duck()を作成し、.quacks_like_a_duck()場合には、限り、我々はコンサートだとして、それはアヒルです!

class Person: 
    def looks_like_a_duck(self): pass 
    def walks_like_a_duck(self): pass 
    def quacks_like_a_duck(self): pass 

class FakeDuck: 
    def looks_like_a_duck(self): pass 
    def walks_like_a_duck(self): pass 
    def quacks_like_a_duck(self): print('Quack quack quack') 

def funcy_duck(): 
    funcy_duck.looks_like_a_duck = lambda: None 
    funcy_duck.walks_like_a_duck = lambda: None 
    funcy_duck.quacks_like_a_duck = lambda: None 
    return funcy_duck 

print(is_a_duck(Person()) 
print(is_a_duck(FakeDuck()) 

try: 
    print(is_a_duck(funcy_duck)) 
except AttributeError: 
    print('not a duck yet') 
    funcy_duck() 

print(is_a_duck(funcy_duck)) 

これらはすべてアヒルです - それはあなたがducks.py、または別のファイルでそれらを定義した場合は問題、あるいは漬物としてそれらをダンプし、後でそれらをロードしません。私たちの機能に関しては、彼らはすべて鴨です。意味論に依存するものは何もありませんが、私たちの議論が持つ属性や振る舞いは何ですか。

関連する問題