Python 2.6 Deprecation Warnings with __new__ — Can someone explain why?

rh0dium steven.klass at gmail.com
Fri Oct 23 05:12:52 CEST 2009


Hi all,

I have a basic Monostate with Python 2.6.

class Borg(object):
    __shared_state = {}
    def __new__(cls, *args, **kwargs):
        self = object.__new__(cls, *args, **kwargs)
        self.__dict__ = cls.__shared_state
        return self

    def __init__(self, *args, **kwargs):
        noSend = kwargs.get("noSend", False)
        reportLevel = kwargs.get("reportLevel", 30)
        reportMethods = kwargs.get("reportMethods", "BaseReport")
        contacts= kwargs.get("contacts", None)

a = Borg(contacts="Foo", noSend="Bar", )

Which happily gives me the following Deprecation warning..

untitled:4: DeprecationWarning: object.__new__() takes no parameters
self = object.__new__(cls, *args, **kwargs)

After a bit of googling I find this is attached to Bug #1683368. What
I can't figure out is what Guidos answer means. FWIW - It's
complaining about the following line

self = object.__new__(cls, *args, **kwargs)

Which appears (to me) to be OK. Can someone explain in laymens terms
why this is a problem. I understand that "this is inconsistent with
other built-ins, like list" but I'm not sure I understand why. Would
someone explain this show me the right way to do it?  I have read
Guido's answer on this but I guess I just don't understand his
reasoning.  In short Guido said the following:

  "The message means just what it says. :-) There's no point in
calling object.new() with more than a class parameter, and any code
that did so was just dumping those args into a black hole.

The only time when it makes sense for object.new() to ignore extra
arguments is when it's not being overridden, but init is being
overridden -- then you have a completely default new and the checking
of constructor arguments is relegated to init."

In my case the args that it dumps them into a black hold is simply not
true.  I want an unknown set of args and kwargs to simply be forwarded
onto init.  So what's the problem with this??


Thanks



More information about the Python-list mailing list