2014-10-30 5 views
6

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.

+0

Wygląda to na dupe [Dlaczego obiekt. \ _ \ _ Nowy \ _ \ _ działa inaczej w tych trzech przypadkach] (http://stackoverflow.com/q/19277399), zbadam sprawę. –

+0

Tak, jest to spowodowane tym, że 'ExampleClass' nie ma własnej metody" __new__ ". –

+0

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) –

Odpowiedz

2

Masz odpowiedź w Twoje pytanie:

Typically this error means [...] constructor parameters are [...] being given to object's parameterless constructor [...]

naprawić, zmienić swoje dekorator tylko dodać __init__ i __new__ jeśli podjętych w Type ma tych metod.

Powiązane problemy