Кажется, что позиционные аргументы в функции «перекрываются» при передаче кортежа в качестве аргумента - PullRequest
0 голосов
/ 02 апреля 2020

Я недавно пришел со следующим кодом:

info = ([
                ["id", "name", "price", "quantity"],
                [24351, "pen", 2.41, 500],
                [None, "pencil", 0.99, 25],
                [63401, "grizzly bear", None, 1],
                [3532, "rubber duck", 5.45, 24],
                [1523, None, 3.00, 6.8],
                [11765, "caviar", 67.95, None]
        ], True, False)

Эта "информация" была передана функции:

do_something(info)

Функция была определена следующим образом:

do_something(data, header = False, index = False):
    do something with data

Когда я выполнил код, я получил ошибку: TypeError: объект 'bool' не повторяется. Это было потому, что где-то в коде я попытался l oop над двумерным массивом так:

for row in data:
    for element in row:
        do something

Однако я обнаружил, что «данные» содержат весь кортеж, а не только 2d - массив, вызывающий эту ошибку при достижении «True». Я смог решить проблему, вызвав функцию следующим образом:

do_something(*info)

Таким образом, кортеж распаковывается правильно. Однако я ищу другое решение, так как я не могу решить, как вызывается функция, поэтому она должна оставаться такой:

do_something(info)

В настоящее время я также пытаюсь понять, ПОЧЕМУ данные кажутся «перекрытие». Значение позиционных аргументов 1 и 2 (заголовок и индекс) будет правильно адресовать позиции 1 и 2 кортежа, который передается функции. Заголовок Истинный, Индекс Ложный (за исключением того, что это по умолчанию). Однако 0-й позиционный аргумент «data» содержит не только 0-й элемент кортежа, 2d-массив, но и все данные внутри информационного кортежа.

Здесь я рассмотрел некоторые темы переполнение стека и нашел решение, используя *, а также некоторые объяснения, как кортежи работают в вызовах функций, а также позиционные аргументы в целом, но я не смог понять, почему весь информационный кортеж оказался бы внутри 0-го позиционного аргумента «data» в то время как «заголовок» и «индекс» будут работать ожидаемым образом, просто вытягивая части кортежа, соответствующие их положению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...