Argumentos Validando Python em subclasses
-
20-08-2019 - |
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?
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__
.