Как проверить, что новый экземпляр класса является правильным типом данных (python) - PullRequest
0 голосов
/ 09 апреля 2011

Я хочу создать класс, который принимает данные только в определенном формате и в противном случае возвращает ошибку. Например,

class Sentence:
  def __init__(self, input):
    self.initial_input = input

## Check and assign input
if  isinstance(input, (list, tuple)):
  self.tagged = input
else: raise TypeError, ('Input must be a list.')

Этот код, кажется, выполняет свою работу, но я пытаюсь выяснить, есть ли лучший способ сделать это, возможно, с помощью некоторой встроенной функции классов в Python. У меня есть много аргументов, которые должны быть в определенных форматах, поэтому мой def __init__ становится довольно громоздким при такой настройке. Есть ли какая-либо причина, чтобы не обрабатывать проверку первоначальной реализации нового объекта класса таким образом? Я пытался немного осмотреться, но не могу найти много.

1 Ответ

4 голосов
/ 09 апреля 2011

Использование типизирования утки распространено в Python, поэтому проверка типа обычно не рекомендуется, если в этом нет крайней необходимости.Как правило, если аргумент должен быть определенного типа, лучше всего предположить, что пользователь предоставил правильный тип.Это позволяет пользователю предоставлять что-то, что не совсем правильно, но все еще работает, и позволяет использовать фиктивные объекты для целей тестирования.В некоторых случаях может быть полезно просто попытаться преобразовать все, что пользователь дал вам, в то, что вы хотите.В вашем примере, вы можете просто сделать: self.tagged = list(input).Конструктор list будет принимать самые разные последовательности (которые пользователь может захотеть использовать, но их может быть недостаточно для ваших нужд) и составляет из него список.

Иногда, однако, вы делаетенужно некоторые вид проверки.Например, если функция должна принимать списки или указания и делать что-то другое в зависимости от того, что вы предоставили.В этих ситуациях вы можете использовать абстрактную систему базовых классов Python.См. Классы в коллекциях и числах модуля.Используя их, вы можете выполнить isinstance проверку, чтобы увидеть, является ли что-то Sequence, Mapping или Number без явного указания всех возможностей.Возможно, вы заметили, что классы list, dict и int на самом деле не являются производными от Sequence, Mapping и Number, но это нормально - абстрактные классы могут определить, какие классы считаютсяподклассы для целей функции isinstance.Вы можете использовать модуль abc для определения новых абстрактных классов такого рода.Поэтому, если вам нужно выполнить много проверок для определенного набора классов, вам может быть проще и понятнее определить абстрактный класс, который утверждает, что он является его собственным.Затем, позже, вы можете добавить больше классов (или программную проверку) к абстрактному классу, чтобы охватить больше случаев без необходимости обновлять все места, где вам нужно было выполнить проверку.

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