Нет никаких причин не использовать такие дозорные объекты для таких целей. В качестве альтернативы объекту класса вы также можете создать одноэлементный экземпляр динамически создаваемого типа:
ользуюargspec в функции, которая принимает другую функцию или метод в качестве аргумента и возвращает кортеж, подобный этому:
(("arg1", obj1), ("arg2", obj2), ...)
Это означает, что первым аргументом переданной функции является arg1, и он имеет значение по умолчанию obj1 и так далее.
Вот руб: если он не имеет значения по умолчанию, мне нужно значение заполнителя, чтобы обозначить это. Я не могу использовать None, потому что тогда я не могу различитьнет значения по умолчанию а такжезначение по умолчанию Нет, То же самое для False, 0, -1 и т. Д. Я мог бы сделать его кортежем с одним элементом, но тогда код для проверки его будет уродливым, и я не могу легко превратить его в диктовку. Поэтому я подумал, что создам объект типа None, который не является None, и вот что я придумал:
class MetaNoDefault(type):
def __repr__(cls):
return cls.__name__
__str__ = __repr__
class NoDefault(object):
__metaclass__ = MetaNoDefault
В настоящее время("arg1", NoDefault)
указывает, что arg1 не имеет значения по умолчанию, и я могу делать такие вещи, какif obj1 is NoDefault:
и т. д. метакласс делает его печатным как простоNoDefault
вместо<class '__main__.NoDefault'>
.
Есть ли причина не делать это так? Есть ли лучшее решение?