Предупреждения об устаревании Python в Monostate __new__ - Кто-нибудь может объяснить, почему?
У меня есть базовый Monostate с 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", )
Что с радостью дает мне следующее предупреждение об устаревании..
untitled:4: DeprecationWarning: object.__new__() takes no parameters
self = object.__new__(cls, *args, **kwargs)
После небольшого поиска я обнаружил, что это прикреплено к ошибке # 1683368. Я не могу понять, что это значит. Жалуется на следующую строчку
self = object.__new__(cls, *args, **kwargs)
Который, кажется, в порядке. Может ли кто-нибудь объяснить непрофессионалами, почему это проблема. Я понимаю, что "это несовместимо с другими встроенными модулями, такими как список", но я не уверен, что понимаю, почему. Кто-нибудь объяснит это, покажет мне правильный способ сделать это?
Спасибо
2 ответа
Смотрите /questions/31086012/python-singlton-sozdanie-obekta и обратите внимание Alex Martelli единственный пример Alex Martelli:
class Singleton(object):
__instance = None
def __new__(cls):
if cls.__instance == None:
__instance = type.__new__(cls)
__instance.name = "The one"
return __instance
__new__ deprecation
На вопрос ответил Гвидо:
Сообщение означает только то, что оно говорит.:-) Нет смысла вызывать объект.__new__() с более чем параметром класса, и любой код, который делал это, просто сбрасывал эти аргументы в черную дыру.
Единственный раз, когда для object.__new__() имеет смысл игнорировать дополнительные аргументы, это когда он не переопределяется, но __init__ переопределяется - тогда у вас полностью __new__ по умолчанию, и проверка аргументов конструктора передается __init__.
Цель всего этого состоит в том, чтобы отловить ошибку в вызове, подобном объекту (42), который (снова) передает аргумент, который не используется. Это часто является признаком ошибки в вашей программе.
--Guido
Предупреждение исходит из того факта, что __new__()
может иметь аргументы, но так как они игнорируются везде, передача аргументов (кроме cls) вызывает предупреждение. На самом деле (на данный момент) ошибка не передавать лишние аргументы, но они не имеют никакого эффекта.
В py3k будет ошибкой передавать аргументы.