Должны ли вы импортировать все классы, которые вы используете в Python? - PullRequest
3 голосов
/ 13 октября 2009

Отсутствие в Python статической типизации позволяет использовать классы и полагаться на них, не импортируя их. Стоит ли их импортировать? Имеет ли это значение?

Пример

someclass.py

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

someclient.py

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

Здесь функциональность SomeClient явно зависит от SomeClass или, по крайней мере, от того, что ведет себя так же. Тем не менее, someclient.py будет отлично работать без import someclass. Это нормально? Чувствовать себя неправильно, не говоря нигде, что ты это используешь.

Ответы [ 4 ]

9 голосов
/ 13 октября 2009

Да, все в порядке. some_class_instance может быть чем угодно, это не обязательно должен быть экземпляр SomeClass. Возможно, вы захотите передать экземпляр, который выглядит как SomeClass, но использует другую реализацию для тестирования, например.

6 голосов
/ 13 октября 2009

Импорт SomeClass не повлияет на работу этого кода.

Если вы беспокоитесь о том, чтобы сделать код понятным, прокомментируйте тот факт, что SomeClient ожидает экземпляр SomeClass, и / или запишите его в строку документации.

Если вы хотите полиции тот факт, что SomeClient требует SomeClass экземпляр, вы можете assert это:

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

который будет требовать импорта SomeClass. Но обратите внимание, что вы там довольно ограничены - это исключает использование Mock SomeClass для тестирования, например. (Здесь об этом много говорится: "isinstance () считается вредным" .)

4 голосов
/ 13 октября 2009

В этом случае вам не следует импортировать класс.

Python полагается на то, что называется " утка, печатающая " - если он ходит как утка и крякает как утка, это может быть и утка.

Вашему коду не важно, какой класс действительно передается при запуске программы. Все, что его волнует, - это то, что он действует так же, как и "SomeClass".

утиного набрав

Питонический стиль программирования, который определяет тип объекта проверка его метода или атрибута подпись, а не явная отношение к некоторому типу объекта («Если это похоже на утку и крякает как утка, это должна быть утка. подчеркивая интерфейсы, а не конкретные типы, хорошо продуманный код повышает его гибкость, позволяя полиморфное замещение. Утка-типирование избегает тестов с использованием type () или isinstance (). (Обратите внимание, однако, что типирование утки может быть дополнено абстрактные базовые классы.) Вместо этого это обычно использует тесты hasattr () или Программирование EAFP.

1 голос
/ 13 октября 2009

Это хороший код на Python, «мы все здесь взрослые», возможно, если вы ожидаете, что класс, вы должны добавить комментарий, и это нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...