Вопрос №55497 от пользователя Muhammed Dinaev в уроке «Встроенные map, filter, reduce», курс «Python: Функции»
https://ru.hexlet.io/code_reviews/418415
Добрый день!
Не могу понять почему тесты не проходят. Я прогнал все те же тесты в IDE и все работает.
''Аргумент *args в определении функции пишется после всех обычных позиционных аргументов перед первым аргументом со значением по умолчанию, а **kwargs пишется в самом конце, после последнего аргумента со значением по умолчанию. Давайте определим функцию, которая принимает все виды аргументов:
def f(x, y, *args, kx=None, ky=42, **kwargs): ... return (x, y, args, kx, ky, kwargs) ... f(1, 2, 3, 4, kx='a', ky='b', kz='c') (1, 2, (3, 4), 'a', 'b', {'kz': 'c'})''
Вопрос, почему в тестах порядок kwargs и *args наоборот? битый час не мог понять в чем дело пока в определении функции не переставил местами на walk(kwargs, *args).
При том, что если в Pycharm сделать такую перестановку все рушится с ошибкой (list indices must be integers or slices, not str)
Мухаммед Динаев,
Вопрос, почему в тестах порядок kwargs и *args наоборот? битый час не мог понять в чем дело пока в определении функции не переставил местами на walk(kwargs, *args).
В тестах вообще нет никаких *args
и **kwargs
. И в задании нет.
Синтаксис *args
/**kwargs
предназначен для описания функций, которые работают с произвольными наборами аргументов. По заданию же функция walk
должна работать со словарём и списком - с двумя конкретными аргументами ровно в таком порядке.
Почему бы тогда не писать универсально правильные структуру передачи аргументов в соответствии с тем, материалом, который был подан. Потому что тестовые вопросы ничего не говорят про произвольные наборы аргументов. Вот пример. https://cloud.mail.ru/public/13bK/hDffMyvnA
И еще, почему от перестановки рушится код в Pycharm.
Потому что тестовые вопросы ничего не говорят про произвольные наборы аргументов.
Перечитайте про "переменное количество аргументов" и "получение именованных аргументов в виде словаря".
И еще, почему от перестановки рушится код в Pycharm.
Вы меняете местами имена аргументов функции, но функция-то вызывается с позиционными аргументами. От того, что вы переставили args
вперёд, список не станет передаваться первым аргументом, а словарь вторым.
Почему бы тогда не писать универсально правильные структуру передачи аргументов в соответствии с тем, материалом, который был подан.
Что такое "универсально правильные структуры передачи аргументов"?
Вы предлагаете любой аргумент, который принимает словарь, называть kwargs
, а тот, что принимает список, называть args
?
Это не имеет смысла, потому что "args" переводится как "аргументы", а "kwargs" как "именованные аргументы" и эти имена должны использоваться только тогда, когда функция ожидает переменное количество аргументов и не может дать имя каждому.
Использовать же абстрактное имя "args" вместо конкретного "path" в walk()
это уже просто плохой стиль именования.
Более того, использовать имена args
и kwargs
, как это делаете вы, в принципе не следует: любой разработчик на Python ожидает видеть эти аргументы строго в виде *args
и **kwargs
, но никак не в качестве имён для одиночных аргументов, как в вашей функции walk(args, kwargs)
.
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







