Как написать такую функцию?

Нужна возможность передать в одну и ту же функцию x,z или x,y,z (именно 2 или 3, не меньше и не больше) и отдавать x,y,z. При том что Y по барабану какое значение, т.е. можно просто отдавать y=0.

По сути это def foo(x, y=0, z), но так нельзя.


Ответы (3 шт):

Автор решения: Ildar

как насчет того чтобы передавать параметры с именем аргумента в функцию

def foo(x, y=0, z=0):
    pass

foo(x=5, z=3)
→ Ссылка
Автор решения: Евгений

Могу предложить вариант с проверкой, введено ли третье значение

>>> def example(x, y, z=None):
...   if z is None:
...     z = y
...     y = 0 # то самое значение по умолчанию
...   return x, y, z
...
>>> example(1, 2, 3)
(1, 2, 3)
>>> example(1, 2)
(1, 0, 2)
>>>

Если значения 2, что второе записывается в y, а потом вручную переносится в z


Проблемы могут возникнуть только в случае, если None - валидное значение третьего аргумента, и оно может попасть туда естественным способом:

example(1, 2, None)

UPD

Дополню ответ решением через *args:

>>> def example(*xyz):
...   if len(xyz) == 2:
...     x, z = xyz
...     y = 0
...   elif len(xyz) == 3:
...     x, y, z = xyz
...   else:
...     raise TypeError('example() takes 2 or 3 positional arguments but {} were given'.format(len(xyz)))
...
...   return x, y, z
...
>>> example(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in example
TypeError: example() takes 2 or 3 positional arguments but 1 were given
>>> example(1, 2)
(1, 0, 2)
>>> example(1, 2, 3)
(1, 2, 3)
>>> example(1, 2, 3, 4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in example
TypeError: example() takes 2 or 3 positional arguments but 4 were given

Это решение устойчиво к типам аргументов, и наличие агрумента None ему никак не навредит

→ Ссылка
Автор решения: vadim vaduxa
def example(default=('x', 'y', 'z'), n=0, **kw):
    return [kw.get(k, n) for k in default]

print(example())  # [0, 0, 0]
print(example(x=1, z=2))  # [1, 0, 2]
→ Ссылка