Проверка аргументов Python в подклассах
-
20-08-2019 - |
Вопрос
Я пытаюсь проверить несколько аргументов python.Пока мы не получим новую статическую типизацию в Python 3.0, каков наилучший способ сделать это.
Вот пример того, что я пытаюсь:
class A(object):
@accepts(int, int, int)
def __init__(a, b, c):
pass
class B(A):
@accepts(int, int, int, int)
def __init__(a, b, c, d):
A.__init__(a, b, c)
Как вы можете видеть, декоратор прекрасно выполняет проверку типов входных данных для моего класса, но я должен определить все аргументы для второго класса, что становится очень неприятным, когда у меня есть несколько уровней наследования.Я могу использовать kwargs с некоторым успехом, но это не совсем так приятно, как описанный выше подход к проверке типов.
По сути, я хочу удалить один аргумент из списка kwargs и проверить его тип, затем передать остаток его родительскому элементу, но сделать это очень гибким и чистым способом по мере масштабирования.
Есть какие-нибудь предложения?
Решение
Почему бы просто не определить any
значение и украсьте конструктор подкласса @accepts(any, any, any, int)
?Ваш декоратор не будет проверять параметры, помеченные any
, и в @accepts
в конструкторе суперкласса будут проверены все аргументы, переданные ему подклассами.
Другие советы
Возможно, вы захотите поиграться с inspect
модуль.Это позволит вам перечислять суперклассы, списки аргументов и другие забавные вещи.Похоже, что вы, возможно, захотите просмотреть список аргументов суперкласса __init__
метод и сравните его с тем, что у вас есть в подклассе.Я не уверен, сработает ли это у вас или нет.
Однако я был бы осторожен с тем, какие предположения вы делаете.Возможно, было бы небезопасно предполагать, что только потому, что класс A имеет N аргументы в пользу __init__
, подклассы будут содержать по крайней мере N аргументы и передают первый N вплоть до суперкласса.Если подкласс более специфичен, то он может заполнить все по 2 аргумента для своих суперклассов __init__
способ.