Python Deprecation Warnings with Monostate __new__ -- Can someone explain why?
deprecated, monostate, python
Solution
See python-singleton-object-instantiation, and note Alex Martelli's singleton example:
class Singleton(object):
__instance = None
def __new__(cls):
if cls.__instance == None:
__instance = type.__new__(cls)
__instance.name = "The one"
return __instance
The `__new__ deprecation` question was answered by Guido:
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__.
The purpose of all this is to catch the error in a call like object(42) which (again) passes an argument that is not used. This is often a symptom of a bug in your program.
--Guido
Problem
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 this means. It's complaining about the following line ``` self = object.__new__(cls, *args, **kwargs) ``` Which appears 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? Thanks