Я переношу некоторый код из 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, что приведет к недействительности этого кода, поэтому я могу больше узнать об этом.
Это выглядит как обман [Почему объект. \ _ \ _ New \ _ \ _ работает по-разному в этих трех случаях] (http://stackoverflow.com/q/19277399), я буду исследовать. –
Да, это вызвано 'ExampleClass', не имеющим собственного метода' __new__'. –
Возможный дубликат [Почему объект \ _ \ _ new \ _ \ _ работает по-разному в этих трех случаях] (http://stackoverflow.com/questions/19277399/why-does-object-new-work-differently-in -the-three-cases) –