Проверка аргументов Python в подклассах - PullRequest
0 голосов
/ 28 января 2009

Я пытаюсь проверить несколько аргументов 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 и проверить его тип, затем передать остаток его родителю, но сделать это очень гибко и чисто, так как это масштабируется.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 28 января 2009

Почему бы просто не определить значение any и не украсить конструктор подкласса с помощью @accepts(any, any, any, int)? Ваш декоратор не будет проверять параметры, отмеченные any, а @accepts в конструкторе суперкласса будет проверять все аргументы, переданные ему подклассами.

0 голосов
/ 28 января 2009

Возможно, вы захотите поиграть с модулем inspect. Это позволит вам перечислять суперклассы, списки аргументов и другие забавные вещи. Возможно, вы захотите проверить список аргументов метода суперкласса __init__ и сравнить его с тем, что имеется в подклассе. Я не уверен, сработает ли это для вас или нет.

Я был бы осторожен с тем, какие предположения вы делаете. Возможно, небезопасно предполагать, что только потому, что класс A имеет N аргументов для __init__, подклассы будут содержать не менее N аргументов и передавать первые N до суперкласса. Если подкласс является более конкретным, он может заполнить все 2 аргумента своего метода суперкласса __init__.

...