TypeError beim Kombinieren von ABCMeta mit __init_subclass__ in Python 3.6

9

Ich versuche, das neue __init_subclass__ -Feature von Python 3.6 ( PEP 487 ) zu verwenden ) mit dem abc Modul. Es scheint nicht zu funktionieren. Der folgende Code:

%Vor%

ergibt folgendes beim Ausführen:

%Vor%

Alles funktioniert gut, wenn Abstracted nicht die% metaclass ABCMeta verwendet.

Dieser Fehler ist ziemlich resistent, der folgende Code zum Beispiel schlägt immer noch mit einem ähnlichen Typfehler fehl (vermutlich, weil eine Metaklasse ' __new__ zur Klasseninstanziierungszeit ausgeführt wird, während die Elternklasse' __new__ 'erst ausgeführt wird Objekt Instanziierung).

%Vor%

Kann jemand bestätigen, dass dies ein Fehler in der Python 3.6 abc -Modul- und / oder __init_subclass__ -Implementierung ist? (Ich könnte __init_subclass__ falsch verwenden.) Hat jemand einen Workaround?

    
So8res 16.02.2017, 18:15
quelle

1 Antwort

6

Es ist ein Fehler in abc.ABCMeta , aufgrund einer Warze im Design von __init_subclass__ . Ich empfehle es zu melden.

So ziemlich jede Metaklasse soll jetzt unerwartete Schlüsselwortargumente an super().__new__ weitergeben, damit type.__new__ sie an __init_subclass__ weitergeben kann, aber ABCMeta und wahrscheinlich Tonnen anderer Metaklassen tun das noch nicht. abc.ABCMeta.__new__ erstickt das Schlüsselwort x , anstatt es zu übergeben, wodurch die angezeigte Ausnahme verursacht wird.

Der Versuch, __init_subclass__ Schlüsselwortargumente mit einer Metaklasse zu verwenden, die nicht für das neue Design aktualisiert wurde, wird nicht funktionieren. Du musst auf die Metaklassen warten, die du gepatcht hast.

    
user2357112 16.02.2017, 18:46
quelle

Tags und Links