Почему я все еще получаю генератор, даже если я не нажимаю ключевое слово yield в функции - PullRequest
0 голосов
/ 25 мая 2018
def get_data(batchsize=None):
    conn = psycopg2.connect('database parameter')
    cursor = conn.cursor()
    query = 'select * from table'
    cursor.execute(query)
    if not batchsize:
        result = cursor.fetchall()
        return result
    else:
        while True:
            result = cursor.fetchmany(batchsize)
            if not result:
                break
            yield result

if __name__ == '__main__':
    data = get_data()

В вышеприведенной функции типом данных должен быть список в качестве аргумента batchsize = None.но эта функция возвращает генератор в обоих случаях.Если я комментирую другую часть функции, она возвращает список.

1 Ответ

0 голосов
/ 25 мая 2018

Ах, я понял, о чем ты спрашиваешь.Вы спрашиваете:

Почему я все еще получаю генератор, даже если я не нажимаю ключевое слово yield в get_data()?

Дело в том, чтофункция, которая содержит хотя бы один оператор yield, является генератором.Итак, ваша get_data() функция является генератором .Из-за этого вы всегда получаете объект генератора из get_data().

Значение return в генераторе немного отличается от обычной функции.В генераторе любое выражение return x эквивалентно raise StopIteration(x).

А когда вы закомментируете деталь с помощью else, вы закомментируете оператор yield, поэтому get_data() становится обычной функцией.Поэтому он возвращает list, как вы ожидаете.

Связанные SO сообщение: Возврат и доходность в той же функции

...