Python模块是否应该导入它们在语义上依赖的模块?

时间:2016-08-02 19:57:48

标签: python

Python模块import应该是它们在语义上依赖的模块吗?

例如:

模块a

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

模块b

import a

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

严格来说,模块b的第一行是不必要的,但是我想知道它在Python中是否被认为是好的形式?

1 个答案:

答案 0 :(得分:5)

b在语义上取决于 nothing

从字面上看,def f唯一依赖的是a_instance生成一个可调用的属性.foo。完全停止。

如果您传入A()AChild()甚至是MagicMock,这无关紧要。

这就是短语" duck typing"手段。考虑:

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或不同的文件中定义它们,或者甚至将它们作为泡菜转储并稍后加载它们并不重要。就我们的职能而言,他们都是鸭子。除了我们的论证所具有的属性和行为之外,没有任何语义依赖。