Com classes normais você tem **kwargs
argumentos __init__
de palavras-chave não correspondentes que podem ser ignorados:
class MyClass:
def __init__(self, a, **kwargs):
self.a=a
my_class = MyClass(20, **{"kwarg1" : 1})
Existe um equivalente @dataclass
que pode ignorar facilmente argumentos de palavras-chave não correspondentes sem precisar incluir um __init__
?
from dataclasses import dataclass
@dataclass
class MyClass:
a: int
my_class = MyClass(20, **{"kwarg1" : 1}) # TypeError: MyClass.__init__() got an unexpected keyword argument 'kwarg1'
TL;DR Não, é impossível
Esse cenário foi até citado na introdução original
dataclass
.Acho que isso vai contra as suposições originais
dataclass
- que simplificariam a semântica em detrimento de tornar a funcionalidade menos flexível.vídeo pep-0557
Embora
@dataclass
não suporte nativamente uma opção para ignorar argumentos de palavras-chave não correspondentes, você pode usar um decorador wrapper que corrige o__init__
método gerado por@dataclass
com uma função wrapper que passa para o__init__
método original apenas argumentos de palavras-chave que correspondem à sua assinatura :para que:
saídas:
Demonstração: https://ideone.com/OnZPbw