Python 2'den Python 3'e bazı kodları taşırım ve farklı davranışlar alıyorum. "Ne değişti" listelerine bakmak bana herhangi bir ilgili farklılığa işaret etmedi, ama muhtemelen büyük bir özlemi kaçırdım.TypeError: object() hiçbir parametre almaz - sadece Python 3'te
bu 'minimal hatalı programı' almak benim kod mümkün olduğunca basitleştirilmiş var:
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)
Bu kod çalışır ve baskılar Python 2.7 Constructed example instance
. Bu kod başarısız oluyor ve Python 3.4'te bir yığın izi kalıyor.
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
Genellikle bu hata birisi
__init__
(ve böylece yapıcı parametreleri uygun sınıfını atlayarak ve
object
'ın parametresiz yapıcı verilmektedir yanlış demektir, ama bu durum burada görünmüyor.
Oh ve sonradan olarak, evet, param
değeri Python 2.7 5'i idi doğruladı.
2to3
Lütfen bu kodu geçersiz kılan Python 3'teki bir değişikliğin işaretçisini belirtin, bu yüzden daha fazla bilgiyi okuyabilirim.
Typically this error means [...] constructor parameters are [...] being given to object's parameterless constructor [...]
, düzeltmek yalnızca iletilen Type
sahip olanlar yöntemlerle eğer __init__
ve __new__
eklemek için dekoratör değiştirmek için:
Bu, [Neden nesne. \ _ \ _ New \ _ \ _ bu üç durumda farklı çalışır] bir dupe gibi görünüyor (http://stackoverflow.com/q/19277399), Araştıracağım. –
Evet, buna 'ExampleClass' tarafından bir' __new__' yöntemi uygulanmıyor. –
olası bir kopyası [Neden nesne. \ _ \ _ New \ _ \ _ bu üç durumda farklı çalışır] (http://stackoverflow.com/questions/19277399/why-does-object-new-work-differently-in -bu üç vaka) –