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

Max*_*axB 1 python

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

例如:

模块a:

class A(object):
    ...
    def foo(self):
        ...
Run Code Online (Sandbox Code Playgroud)

模块b:

import a

def f(a_instance):
    a_instance.foo()
    ...
Run Code Online (Sandbox Code Playgroud)

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

Way*_*ner 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
Run Code Online (Sandbox Code Playgroud)

如果你创造的东西.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))
Run Code Online (Sandbox Code Playgroud)

这些都是鸭子 - 如果您定义它们ducks.py或不同的文件无关紧要,甚至将它们作为泡菜转储并稍后加载它们.就我们的功能而言,它们都是鸭子.除了我们的参数具有什么属性和行为之外,没有任何语义依赖关系.