Вопрос

Я пытаюсь проверить несколько аргументов 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__ способ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top