Как написать такую функцию?
Нужна возможность передать в одну и ту же функцию x,z или x,y,z (именно 2 или 3, не меньше и не больше) и отдавать x,y,z. При том что Y по барабану какое значение, т.е. можно просто отдавать y=0.
По сути это def foo(x, y=0, z), но так нельзя.
Ответы (3 шт):
как насчет того чтобы передавать параметры с именем аргумента в функцию
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 ему никак не навредит
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]