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

Рейтинг: 0Ответов: 1Опубликовано: 31.01.2023

Необходимо написать функцию create_dictionary, которая принимает столько аргументов, сколько необходимо и создает словарь, в котором ключами будут эти аргументы (каждый аргумент это разный ключ), предоставляемые функции и значение это позиции этих аргументов.

Не все предоставляемые аргументы будут восприимчивы к созданию словаря. Выведи f"Cannot add {argument} to the dict!" для каждого неприемлемого аргумента.

Также согласовано, что аргументы, предоставленные для функции create_dictionary будут только следующих типов: int, float, str, bool, NoneType, list, tuple, set, dict, function.

Также в этой задаче неельзя использовать функции hash или конструкции try/except.

Подсказка: используйте isinstance, также вы можете использовать callable(object) для того, чтобы проверить, object это функция или нет.

Написал функцию:

def create_dictionary(*args) -> dict:
    new_dict = {}
    s = ""
    for i in range(len(args)):
        if isinstance(i, int or float or str or bool or tuple):
            new_dict[args[i]] = i
        if isinstance(i, list or set or dict):
            s += f"Cannot add {i} to the dict!"

    return new_dict
    return s

Пример использования:
create_dictionary(7, 1, 3)  # returns {7: 0, 1: 1, 3: 2}
create_dictionary(3, [1, 2], 5)  # prints "Cannot add [1, 2] to the dict!" and returns {3: 0, 5: 2}
create_dictionary(3, (1, 2), 5)  # returns {3: 0, (1, 2): 1, 5: 2}

Но при проверке на тестах, выводит по некоторым тестам ошибки:


args = (3, [1, 2], 5), expected_std_output = 'Cannot add [1, 2] to the dict!\n'
expected_result = {3: 0, 5: 2}

TypeError: unhashable type: 'list'


args = (3, {1, 2}, 5), expected_std_output = 'Cannot add {1, 2} to the dict!\n'
expected_result = {3: 0, 5: 2}

TypeError: unhashable type: 'set'

args = (3, {1: 1, 2: 2}, False)
expected_std_output = 'Cannot add {1: 1, 2: 2} to the dict!\n'
expected_result = {False: 2, 3: 0}

TypeError: unhashable type: 'dict'

Ответы

▲ 1

Потому что нельзя писать вот так c or:

if isinstance(i, int or float or str or bool or tuple):

Вместо этого надо передавать перечень классов в кортеже:

if isinstance(i, (int, float, str, bool, tuple)):

UPD: Ещё у вас есть ошибка в том, что вы проверяете isinstance для i, хотя i у вас - это индекс элемента в списке. А нужно проверять сам элемент, вот так:

if isinstance(args[i], (int, float, str, bool, tuple)):
            # ^^^^^^^