Przenoszę trochę kodu z Pythona 2 do Pythona 3, a otrzymuję inne zachowanie. Przeglądanie list "co się zmieniło" nie wskazało mi żadnych istotnych różnic, ale prawdopodobnie brakowało mi dużego.TypeError: object() nie pobiera żadnych parametrów - ale tylko w Pythonie 3
I uproszczone mojego kodu jak najwięcej, aby ten „minimalny wadliwego programu”:
def decorator(Type):
""" This is a class decorator. It replaces a class with a subclass which
*should be* equivalent.
The result works on Python 2.7 but not on Python 3.4. """
class FactorySubclass(Type):
""" This subclasses from the provided type, and overrides the __new__
and __init__ methods, but replaces them with exact equivalents,
so I can't see how this has any effect. """
def __new__(cls, *args, **kwargs):
# Simplified this code to do basically nothing.
# If this line is removed, it works on both versions.
return Type.__new__(cls, *args, **kwargs)
def __init__(self, *args, **kwargs):
# Simplified this code to do basically nothing.
Type.__init__(self, *args, **kwargs)
return FactorySubclass
@decorator
class ExampleClass(object):
def __init__(self, param=3):
print("Constructed example instance")
ec = ExampleClass(param=5)
Ten kod działa i drukuje Constructed example instance
w Pythonie 2.7. Ten kod kończy się niepowodzeniem i zrzuca ślad stosu w Pythonie 3.4.
Traceback (most recent call last):
File "mfp.py", line 31, in <module>
ec = ExampleClass(param=5)
File "mfp.py", line 16, in __new__
return Type.__new__(cls, *args, **kwargs)
TypeError: object() takes no parameters
Zazwyczaj błąd ten oznacza, że ktoś błędnie __init__
(a więc parametry konstruktora są pominięciem danej klasy i poświęca się konstruktora bez parametrów object
„s, ale to nie wydaje się być w tym przypadku.
Aha, i jak musztarda po obiedzie, i potwierdziły, że tak, wartość param
był 5 w Pythonie 2.7.
2to3
nadaje jej oczyszczenia świadectwo zdrowia.
Podaj mi wskazówkę dotyczącą zmiany w Pythonie 3, która unieważnia ten kod, więc mogę przeczytać więcej na ten temat.
Wygląda to na dupe [Dlaczego obiekt. \ _ \ _ Nowy \ _ \ _ działa inaczej w tych trzech przypadkach] (http://stackoverflow.com/q/19277399), zbadam sprawę. –
Tak, jest to spowodowane tym, że 'ExampleClass' nie ma własnej metody" __new__ ". –
możliwy duplikat [Dlaczego obiekt. \ _ \ _ Nowy \ _ \ _ działa inaczej w tych trzech przypadkach] (http://stackoverflow.com/questions/19277399/why-does-object-new-work-różnie- w -these-three-cases) –