2014-10-30 3 views
6

Я переношу некоторый код из Python 2 в Python 3, и у меня другое поведение. Рассмотрение списков «что изменилось» не указывало мне на какие-либо существенные различия, но, по-видимому, я пропустил большой.TypeError: object() не принимает параметров - но только в Python 3

Я упростили мой код как можно больше, чтобы получить эту «минимальную неисправную программу»:

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) 

Этот код работает, и печатает Constructed example instance в Python 2.7. Этот код выходит из строя и выгружает трассировку стека в Python 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 

Обычно эта ошибка означает, что кто-то неправильно __init__ (и поэтому параметры конструктора обходят соответствующий класс и отдаются без параметров конструктора object «s, но это, кажется, не тот случай.

о, и задним числом, я подтвердил, что да, значение param было 5 в Python 2.7.

2to3 дает ему чистый-счет здоровья.

Пожалуйста, дайте мне указатель на изменение в Python 3, что приведет к недействительности этого кода, поэтому я могу больше узнать об этом.

+0

Это выглядит как обман [Почему объект. \ _ \ _ New \ _ \ _ работает по-разному в этих трех случаях] (http://stackoverflow.com/q/19277399), я буду исследовать. –

+0

Да, это вызвано 'ExampleClass', не имеющим собственного метода' __new__'. –

+0

Возможный дубликат [Почему объект \ _ \ _ new \ _ \ _ работает по-разному в этих трех случаях] (http://stackoverflow.com/questions/19277399/why-does-object-new-work-differently-in -the-three-cases) –

ответ

2

У вас есть ответ на ваш вопрос:

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

Чтобы исправить, изменить свой декоратор только добавить __init__ и __new__ если пройденных в Type есть те методы.

Смежные вопросы