Existe-t-il un moyen d'empêcher certains mais pas tous les arguments d'être envoyés à une super-classe?Est-il possible d'être sélectif sur les kwargs à transmettre à une super-classe en python?
J'ai une classe de base qui vérifie l'entrée d'utilisateur:
class Base(object):
def __init__(self, **kwargs):
self.kwargs = kwargs
super(Base, self).__init__()
@staticmethod
def check_integrity(allowed, given):
"""
Verify user input.
:param allowed: list. Keys allowed in class
:param given: list. Keys given by user
:return:
"""
for key in given:
if key not in allowed:
raise Exception('{} not in {}'.format(key, allowed))
>>> base = Base()
>>> print base.__dict__
output[0]: {'kwargs': {}}
A
hérite de Base
et utilise la méthode pour vérifier ses mots-clés
class A(Base):
def __init__(self, **kwargs):
super(A, self).__init__(**kwargs)
self.default_properties = {'a': 1,
'b': 2}
self.check_integrity(self.default_properties.keys(), kwargs.keys())
>>> a = A(a=4)
>>> print a.__dict__
output[1]: {'default_properties': {'a': 1, 'b': 2}, 'kwargs': {'a': 4}}
Je dois mentionner aussi que je suis sorti une autre méthode que j'ai utilisée dans cette classe pour mettre à jour les propriétés de classe, puisque c'est une complication non pertinente à la question (par conséquent pourquoi a
n'est pas mis à jour à 4
dans l'exemple ci-dessus)
Le problème vient lorsque vous essayez d'hériter de A
et en ajoutant kwargs
supplémentaire à la sous-classe:
class B(A):
def __init__(self, **kwargs):
super(B, self).__init__(**kwargs)
self.default_properties = {'a': 2,
'c': 3,
'd': 4}
self.check_integrity(self.default_properties.keys(), kwargs.keys())
>>> b = B(d=5)
Traceback (most recent call last):
File "/home/b3053674/Documents/PyCoTools/PyCoTools/Tests/scrap_paper.py", line 112, in <module>
b = B(d=5)
File "/home/b3053674/Documents/PyCoTools/PyCoTools/Tests/scrap_paper.py", line 96, in __init__
super(B, self).__init__(**kwargs)
File "/home/b3053674/Documents/PyCoTools/PyCoTools/Tests/scrap_paper.py", line 92, in __init__
self.check_integrity(self.default_properties.keys(), kwargs.keys())
File "/home/b3053674/Documents/PyCoTools/PyCoTools/Tests/scrap_paper.py", line 84, in check_integrity
raise Exception('{} not in {}'.format(key, allowed))
Exception: d not in ['a', 'b']
Ici d
est transmis à la superclasse, même si son seul nécessaire dans la sous-classe. Cependant, les arguments a
et b
sont utilisés dans A
et doivent être passés de B
à A
.
'del kwargs ['d']'? –
Besoin de passer 'kwargs' pour superclasser ceux qui ne sont pas dans' self.default_properties'. Est-ce votre attente @CiaranWelsh? – Rajez
Je voudrais 'a' et' b' de 'B(). Default_properties()' à passer à 'A' mais pas' d' de 'B(). Default_properties()'. – CiaranWelsh