Такое поведение вполне возможно в Python.
def one_or_three(one, two=object(), three=object()):
two_sentinel, three_sentinel = one_or_three.__defaults__
if (two == two_sentinel) != (three == three_sentinel):
raise TypeError("one_or_three() takes 1 or 3 arguments")
...
Это имеет преимущества именованных аргументов (семантическое значение, передача по имени и т. Д.), Но в основном представляет собой вариант проверки значений некоторых переменных, чтобы узнать, были ли переданы одна или три вещи.
Обратите внимание, что два вызова object()
создают два разных объекта и связывают их с функцией:
>>> one_or_three.__defaults__
(<object object at 0x00168540>, <object object at 0x00168ED0>)
Таким образом, они уникальны во всем мире. Если бы вместо этого вы использовали None
в качестве вашего дозорного объекта, то было бы невозможно передать None
в качестве аргумента (хотя, конечно, это может быть желательным).