2014-10-30 12 views
6

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

o temiz bir sağlık-fatura verir.

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:

+0

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

+0

Evet, buna 'ExampleClass' tarafından bir' __new__' yöntemi uygulanmıyor. –

+0

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

cevap

2

Sen Söz konusu cevabım var.

İlgili konular