Списки/словари из функции не возвращаются

Я пытаюсь написать скрипт на Python с использованием BioPython, который читает файл FASTA и создает список необработанных последовательностей ДНК в виде записей.

Поскольку этот код будет использоваться во многих других сценариях, которые я буду писать, я хочу, чтобы функция для этой цели находилась в отдельном файле Python, который я мог бы импортировать в начале каждого другого сценария, который я пишу. Сценарий, содержащий функцию, которую я сейчас вызываю, выглядит так:

from Bio import SeqIO
def read_fasta(dna):
    genome = []
    for seq_record in SeqIO.parse(dna, "fasta"):
        genome.append(str(seq_record.seq))
    return genome

Когда я вызываю эту функцию в Python из cmd, функция работает и читает файлы, генерирующие список, как я хочу. Однако, если я снова попытаюсь получить доступ к списку genome, я получу ошибку Traceback | NameError: name 'genome' not defined.

Может кто-нибудь объяснить, почему это происходит, даже если я поставил оператор return genome? И что я могу сделать, чтобы решить эту проблему?


person rugrln    schedule 29.06.2014    source источник
comment
можешь показать трассировку стека?   -  person karthikr    schedule 29.06.2014
comment
Можете ли вы показать сценарий, в котором вы используете эту функцию с трассировкой стека?   -  person vaidik    schedule 29.06.2014
comment
Куда ты это звонишь? Когда вы вызываете его, он возвращает значение, он не создает переменную с именем genome. Вы должны что-то сделать с возвращаемым значением.   -  person BrenBarn    schedule 29.06.2014
comment
В cmd я вызываю это, говоря: from Bio_FASTA import * read_fasta(pcr_template.fasta) Как мне присвоить переменную геному/что-то с ней сделать? Спасибо!   -  person rugrln    schedule 29.06.2014
comment
genome = read_fasta("pcr_template.fasta"). Хотя эта "глобальная" переменная genome, которую вы создаете, не имеет ничего общего с "локальной" переменной genome, кроме имени ("локальная" genome существует только до тех пор, пока функция read_fasta не завершена), лучше назовите его как-нибудь иначе, например result = read_fasta("pcr_template.fasta"). Теперь, когда вы попытаетесь получить доступ к переменной result, у вас будет список genome.   -  person Reloader    schedule 29.06.2014
comment
@Reloader Теперь я чувствую себя немного глупо, лол, для меня это должно было быть совершенно очевидно! Спасибо за помощь!!! :)   -  person rugrln    schedule 29.06.2014


Ответы (1)


genome находится в локальной области видимости функции, поэтому не виден "снаружи". Вы должны присвоить результат функции read_fasta некоторой переменной, чтобы получить доступ к возвращаемому результату функции. Например:

new_variable = read_fasta("pcr_template.fasta")

И читается - пусть new_variable присваивается результату функции read_fasta с "pcr_template.fasta" в качестве аргумента.

Теперь доступ к genome (или ко всему, что вернула ваша функция) можно получить, просто обратившись к new_variable.

person Reloader    schedule 29.06.2014