Pergunta

Eu estou tentando validar alguns argumentos python. Até chegarmos a nova tipagem estática em Python 3.0, que é a melhor maneira de ir sobre isso.

Aqui está um exemplo do que estou tentando:

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)

Como você pode ver o decorador é muito bem realizando a verificação de tipo das entradas para minha classe, mas eu tenho que definir todos os argumentos para a segunda classe, que fica muito desagradável quando eu tenho vários níveis de herança. Eu posso usar kwargs com algum sucesso, mas não é tão bom como a abordagem acima para verificação de tipo.

Essencialmente eu quero aparecer um argumento fora da lista kwargs e verificar seu tipo, em seguida, passar o restante para que os pais, mas fazer isso de uma forma muito flexível e limpo como este escalas.

Todas as sugestões?

Foi útil?

Solução

Porque não basta definir um valor any, e decorar o construtor de subclasse com @accepts(any, any, any, int)? Seu decorador não irá verificar parâmetros marcados com any, eo @accepts sobre o construtor da superclasse irá verificar todos os argumentos passados ??até ele por subclasses.

Outras dicas

Você pode querer brincar com o módulo inspect. Ele permitirá que você enumerar superclasses, listas de discussão, e outras coisas divertidas. Parece que você pode querer inspecionar a lista de argumentos do método __init__ superclasse e compará-la com o que você tem na subclasse. Eu não tenho certeza se isso vai funcionar para você ou não.

Gostaria de ter cuidado sobre o que suposições que você faz embora. Pode não ser seguro assumir que só porque a classe A tem N argumentos para __init__, subclasses conterá, pelo menos, N argumentos e passar a primeira N através da classe super. Se a subclasse é mais específico, então ele pode preencher todas por 2 dos argumentos para o seu método superclasses __init__.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top