你应该导入你在Python中使用的所有类吗?

Ins*_*ter 3 python coding-style

Python缺乏静态类型使得可以在不导入类的情况下使用和依赖类.你应该导入它们吗?有关系吗?

someclass.py

class SomeClass:
    def __init__(self, some_value):
        self.some_value = some_value
Run Code Online (Sandbox Code Playgroud)

someclient.py

class SomeClient:
    def __init__(self, some_class_instance):
        self.some_class_helper = some_class_instance
Run Code Online (Sandbox Code Playgroud)

在这里,功能SomeClient明显依赖于SomeClass或至少表现得像它的东西.但是,someclient.py可以在没有的情况下正常工作import someclass.这个可以吗?使用某些东西而不说任何你甚至使用它的东西都是错误的.

Luk*_*ský 9

是的,这完全没问题.some_class_instance可能是任何东西,它不一定是一个实例SomeClass.例如,您可能希望传递一个看起来很像的实例SomeClass,但是使用不同的实现来进行测试.

  • +1:仅导入您实际使用的内容.在运行时发生的事情通常是您导入的内容的扩展.不要大惊小怪"导入所有东西,用Python制作静态语言".相反,请正确使用Python的动态特性. (4认同)

Ric*_*dle 6

导入SomeClass不会对代码的工作方式产生任何影响.

如果您担心使代码可理解,请评论SomeClient需要SomeClass实例的事实,并/或在docstring中记录它.

如果你想警告SomeClient需要SomeClass实例的事实,你可以assert:

class SomeClient:
    def __init__(self, some_class_instance):
        assert isinstance(some_class_instance, SomeClass)
        self.some_class_helper = some_class_instance
Run Code Online (Sandbox Code Playgroud)

需要导入SomeClass.但请注意,你在那里相当严格 - 例如,它排除了使用Mock SomeClass进行测试.(这里有一个冗长的咆哮:"isinstance()被认为是有害的".)