是否应该导入Python中使用的所有类?

是否应该导入Python中使用的所有类?,python,coding-style,Python,Coding Style,Python缺少静态类型,因此可以使用和依赖类,而无需导入它们。你应该导入它们吗?这有关系吗 例子 someclass.py class SomeClass: def __init__(self, some_value): self.some_value = some_value class SomeClient: def __init__(self, some_class_instance): self.some_class_helper =

Python缺少静态类型,因此可以使用和依赖类,而无需导入它们。你应该导入它们吗?这有关系吗

例子 someclass.py

class SomeClass:
    def __init__(self, some_value):
        self.some_value = some_value
class SomeClient:
    def __init__(self, some_class_instance):
        self.some_class_helper = some_class_instance
someclient.py

class SomeClass:
    def __init__(self, some_value):
        self.some_value = some_value
class SomeClient:
    def __init__(self, some_class_instance):
        self.some_class_helper = some_class_instance

这里,
SomeClient
的功能显然依赖于
SomeClass
或至少依赖于其行为类似的东西。但是,如果不导入someclass,someclient.py就可以正常工作。这样行吗?在任何地方使用某个东西而不说你正在使用它,感觉是不对的。

导入
SomeClass
对代码的工作方式没有任何影响

如果您担心代码不易理解,请说明
SomeClient
需要一个
SomeClass
实例,并/或将其记录在docstring中

如果您想监控
SomeClient
需要
SomeClass
实例这一事实,您可以
断言它:

class SomeClient:
    def __init__(self, some_class_instance):
        assert isinstance(some_class_instance, SomeClass)
        self.some_class_helper = some_class_instance

这将需要导入
SomeClass
。但是请注意,这里的限制相当严格——例如,它排除了出于测试目的而使用Mock
SomeClass
。(这里有一个冗长的咆哮:)

是的,完全没关系
SomeClass\u实例
可以是任何东西,它不一定是
SomeClass
的实例。您可能希望传递一个看起来像
SomeClass
,但出于测试目的使用不同实现的实例。

在这种情况下,您不应该导入该类

Python依赖于所谓的“”-如果它像鸭子一样走路,像鸭子一样嘎嘎叫,那么它也可能是鸭子

当程序运行时,您的代码并不关心真正传入的类是什么。它所关心的是,它的行为就像“某个阶级”的行为一样

鸭子打字

一种pythonic编程风格,通过 检查其方法或属性 签名而不是显式签名 与某个类型对象的关系(“如果 它看起来像只鸭子,嘎嘎叫起来像只鸭子 鸭子,它一定是一只鸭子 强调界面而不是 特定类型、精心设计的代码 通过允许 多态性替代。鸭子打字 避免使用type()或 isinstance()。(但请注意 duck类型可以与 相反,它 通常使用hasattr()测试或 EAFP编程


这是一个很好的python代码,“我们都是同意的成年人”,也许如果你希望有一个类,你应该包括一个注释,这没关系。

我对类型检查或监督争论绝对不感兴趣。@Daniel:好!不管怎样,这通常是一种不好的做法。防止代码重用和鸭子式键入如果我理解正确,这种逻辑意味着将任何地方使用的每个模块导入顶级程序。这让我感觉非常错误+1:只导入您实际使用的内容。运行时发生的事情通常是您导入的内容的扩展。不要为“导入所有内容以使Python成为静态语言”而大惊小怪。相反,请正确使用Python的动态特性。