Python 2.6 Deprecation Warnings with __new__ — Can someone explain why?
rh0dium
steven.klass at gmail.com
Thu Oct 22 23:12:52 EDT 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