Я использую argspec в функции, которая принимает в качестве аргумента другую функцию или метод и возвращает кортеж, подобный этому:
(("arg1", obj1), ("arg2", obj2), ...)
Это означает, что первым аргументом переданной функции является arg1, и он имеет значение по умолчанию obj1 и т. Д.
Вот загвоздка : если у него нет значения по умолчанию, мне нужно значение заполнителя, чтобы обозначить это. Я не могу использовать None, потому что тогда я не могу различить нет значения по умолчанию и значение по умолчанию 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'>
.
Есть ли причина не делать это так? Есть ли лучшее решение?